【问题标题】:Function/subsquery table with PostgreSQL使用 PostgreSQL 的函数/子查询表
【发布时间】:2014-03-05 05:14:53
【问题描述】:

使用 PostgresSQL 9.3、OSX。

我已经将以下功能组合在一起。
令人震惊的是,它可以工作并根据位置返回一个邮政编码列表。

我现在想对这些结果进行 for/循环,对返回单个多列表的每个邮政编码运行选择查询。将以下 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';

【问题讨论】:

    标签: sql function postgresql subquery plpgsql


    【解决方案1】:

    全部归结为这个简化的查询:

    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 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;
    
    • 对函数体使用美元引用。
    • 不要引用语言名称plpgsql
    • 不鼓励使用 ALIAS。使用现代风格的命名参数。
    • 不需要 plpgsql。一个 sql 函数可以完成这项工作。

    【讨论】:

    • 太棒了!谢谢!没想到这样:)
    • @user2923767:这是一种基于集合的思维方式,而不是程序思维方式。很难翻译,必须重新考虑问题...
    • 选择查询工作正常。但是该函数给了我这个错误:在“WHERE”第8行或附近出现语法错误:WHERE p.npi = $1;
    • @user2923767:分号放错了位置。现已删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多