PostgreSQL的函数/子查询表

gtlvzcf8  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(130)

使用PostgreSQL 9.3,OSX.
我把下面的函数组合在一起。
令人震惊的是,它工作正常,并返回一个基于位置的邮政编码单列表。
现在我想对这些结果进行for/循环,为每个邮政编码运行一个select查询,返回一个单个多列表。将下面的SELECT查询合并到这个函数中的最佳方法是什么?

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';
ftf50wuq

ftf50wuq1#

归结为这个简化的查询:

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>;

你的功能有很多缺点。如果你想保留它,我建议:

CREATE FUNCTION get_npizips (npi_id text)
  RETURNS SETOF text
  LANGUAGE sql 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$;

函数体使用美元引号。
不要引用语言名称plpgsql
不鼓励使用ALIAS。改用命名参数。
不需要PL/pgSQL。一个普通的SQL函数可以完成这项工作。

相关问题