2014-03-05 78 views
1

使用PostgreSQL的9.3,OSX。功能/ subsquery表的PostgreSQL

我在下面的功能砍死在一起。
令人震驚的是,它的工作原理是根據位置返回單個郵政編碼列表。

我現在想爲/通過這些結果循環運行的每一個返回單個多列的表的郵政編碼的選擇查詢。將以下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'; 

回答

0

所有歸結爲這個簡單的查詢:

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
  • 化名是不鼓勵。使用現代風格的命名參數。
  • 不需要plpgsql。一個sql函數完成這項工作。
+0

真棒!謝謝!沒有想到這樣:) – user2923767

+0

@ user2923767:這是基於集合的思維方式,而不是程序性的。很難翻譯,必須重新考慮問題... –

+0

選擇查詢可以正常工作。但是函數給了我這個錯誤:語法錯誤在「WHERE」處或附近 LINE 8:WHERE p.npi = $ 1; – user2923767