带有PostgreSQL的函数/子查询表
使用Postgressql9.3,OSX 我已经拼凑了下面的函数。 令人震惊的是,它可以工作并返回一个基于位置的邮政编码单列表 现在,我想对返回单个多列表的每个邮政编码运行select查询,对这些结果进行for/loop。将以下SELECT查询合并到此函数中的最佳方式是什么带有PostgreSQL的函数/子查询表,sql,function,postgresql,subquery,plpgsql,Sql,Function,Postgresql,Subquery,Plpgsql,使用Postgressql9.3,OSX 我已经拼凑了下面的函数。 令人震惊的是,它可以工作并返回一个基于位置的邮政编码单列表 现在,我想对返回单个多列表的每个邮政编码运行select查询,对这些结果进行for/loop。将以下SELECT查询合并到此函数中的最佳方式是什么 SELECT "NPI" FROM doc WHERE "Provider Business Mailing Address Postal Code"='<ZIPCODERESULTS FROM BELOW>';
SELECT "NPI" FROM doc
WHERE "Provider Business Mailing Address Postal Code"='<ZIPCODERESULTS FROM BELOW>';
CREATE FUNCTION get_npizips (text) RETURNS TABLE(a char(5)) AS '
DECLARE
-- Declare aliases for user input.
npi_id ALIAS FOR $1;
-- Declare a variable to hold the zipcode
zipcode varchar;
BEGIN
SELECT INTO zipcode substring(provider_nodes.address_postal_code for 5) FROM provider_nodes
WHERE provider_nodes.npi = npi_id;
RETURN QUERY SELECT zcta FROM zctas WHERE ST_DWithin(
geom,
(
SELECT geom
FROM zctas
WHERE zcta = zipcode
),
7 * 1.6 * 1000
);
END;
'LANGUAGE 'plpgsql';
这一切归结为一个简化的查询:
SELECT d."NPI"
FROM provider_nodes p
JOIN zctas z0 ON z0.zcta = left(p.address_postal_code, 5)
JOIN zctas z ON ST_DWithin(z.geom, z0.geom, 7 * 1.6 * 1000)
JOIN doc d ON "Provider Business Mailing Address Postal Code" = z.zcta
WHERE p.npi = <your npi_id here>;
对函数体使用美元报价。
不要引用语言名称plpgsql。
不鼓励使用别名。使用命名参数的现代样式。
不需要plpgsql。sql函数完成这项工作。
令人惊叹的非常感谢。不是这样想的:@user2923767:这是基于集合的思维方式,而不是程序的思维方式。很难翻译,必须重新思考问题…选择查询很好。但是函数给了我这个错误:第8行或附近的语法错误:其中p.npi=$1@user2923767:有一个放错位置的分号。现在移除。
CREATE FUNCTION get_npizips (npi_id text)
RETURNS SETOF text AS
$func$
SELECT z.zcta
FROM provider_nodes p
JOIN zctas z0 ON z0.zcta = left(p.address_postal_code, 5)
JOIN zctas z ON ST_DWithin(z.geom, z0.geom, 7 * 1.6 * 1000)
WHERE p.npi = $1
$func$ LANGUAGE sql;