Sql 动态Postgress查询;错误:运算符不存在:字符变化=整数

Sql 动态Postgress查询;错误:运算符不存在:字符变化=整数,sql,dynamic,plpgsql,execute,Sql,Dynamic,Plpgsql,Execute,我知道这是一个简单/愚蠢的问题,但我在这里挣扎 运行:安装Brew的OSX上的Postgress 9.3 下面的函数给了我这个 错误:运算符不存在:字符变化=整数 提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换 查询:从npi=$1的提供者节点中选择子字符串(5的地址\邮政编码) 上下文:PL/pgSQL函数测试(整数)执行语句第9行 npi\u id作为varchar存储在provider\u节点表中,但它是一个数字。 不管怎样,还是我需要更改类型 CREATE OR

我知道这是一个简单/愚蠢的问题,但我在这里挣扎

运行:安装Brew的OSX上的Postgress 9.3 下面的函数给了我这个

错误:运算符不存在:字符变化=整数

提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换

查询:
从npi=$1的提供者节点中选择子字符串(5的地址\邮政编码)

上下文:PL/pgSQL函数测试(整数)执行语句第9行

npi\u id
作为
varchar
存储在
provider\u节点
表中,但它是一个数字。 不管怎样,还是我需要更改类型

CREATE OR REPLACE FUNCTION test(npi_id varchar) RETURNS RECORD AS $$
DECLARE 
zip RECORD;
ptlong RECORD;
ptlat RECORD;
result RECORD;

BEGIN
EXECUTE 'SELECT substring(address_postal_code for 5) FROM provider_nodes WHERE npi = $1' INTO zip;
EXECUTE 'SELECT longitude FROM zctas WHERE zcta=$1' INTO ptlong USING zip;
EXECUTE 'SELECT latitude FROM zctas WHERE zcta=$1' INTO ptlat USING zip;
EXECUTE 'SELECT state, zctas FROM zctas WHERE geom &&   ST_expand(ST_transform(ST_PointFromText("POINT(" || ptlong || " " || ptlat || ")", 4269),32661), 16093) AND ST_distance((ST_transform(ST_PointFromText("POINT(" || ptlong || " " || ptlat || ")", 4269),32661),geom) < 16093' INTO result;
RETURN RESULT;
END;
$$ LANGUAGE plpgsql;
CREATE或REPLACE FUNCTION test(npi_id varchar)将记录返回为$$
声明
邮政编码记录;
长记录;
ptlat记录;
结果记录;
开始
从npi=$1的提供者节点执行“选择子字符串(5的地址\邮政编码)”到zip;
使用zip将“从zcta选择经度,其中zcta=$1”执行到ptlong中;
使用zip将“从zcta选择纬度,其中zcta=$1”执行到ptlat;
执行'SELECT state,zctas FROM zctas WHERE geom&ST|u expand(ST|u transform(ST|u PointFromText(“POINT”(| ptlong | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124;
返回结果;
结束;
$$语言plpgsql;

当您在动态SQL中使用参数时,必须使用USING子句。您在第一条语句中遗漏了它:

EXECUTE 'SELECT substring(address_postal_code for 5) FROM provider_nodes WHERE npi = $1' INTO zip USING npi_id;
但是在这种情况下,使用动态SQL(语句执行)是个坏主意

zip := (SELECT substring(p.address_postal_code for 5) 
           FROM provider_nodes p
          WHERE p.npi = npi_id);