带有PostgreSQL的函数/子查询表

带有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>';

使用Postgressql9.3,OSX

我已经拼凑了下面的函数。 令人震惊的是,它可以工作并返回一个基于位置的邮政编码单列表

现在,我想对返回单个多列表的每个邮政编码运行select查询,对这些结果进行for/loop。将以下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';
这一切归结为一个简化的查询:

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;