2012-03-19 56 views
7

Postgres noobie here。如何引用Postgres sql函數中的命名參數?

我想將SQL Server存儲過程轉換爲Postgres函數。目前無法弄清楚如何將這條SQL線變成Postgres。

SQL服務器:

input: @name = null 

SELECT * 
FROM table 
WHERE name = ISNULL(@name, name) 

Postgres的:

input: n = null 

SELECT * 
FROM table 
WHERE name = COALESCE(n, name) 

我得到的錯誤 「列n不存在。」如何在Postgres函數的select語句中引用參數?

UPDATE:

的Postgres函數定義

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64)) 
RETURNS setof record 
AS 
$$ 
    SELECT u.name 
     , u.description 
    FROM table_a u 
    WHERE u.name = COALESCE(n, u.name); 

$$ 
LANGUAGE sql; 

回答

13

當您的功能在language SQL中時,參數名稱僅僅是裝飾。您可以在定義爲language plpgsql的存儲過程中按名稱使用參數。

因此,您必須參考使用$ X的函數參數,其中X是函數的參數列表的順序位置(從1開始)。

CREATE OR REPLACE FUNCTION fn_name (
    n VARCHAR(32) = NULL, 
    OUT name varchar(32), 
    OUT description varchar(64)) 
RETURNS setof record 
AS 
$$ 
    SELECT u.name 
     , u.description 
    FROM table_a u 
    WHERE u.name = COALESCE($1, u.name); 
$$ 
LANGUAGE sql; 
+0

每@a_horse_with_no_name的點上另一個答案,命名的支持自9.2 http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-一直存在功能論點 – 2017-12-22 17:49:59

8

不能使用命名在與語言= SQL定義的函數的參數。

您需要使用佔位符$ 1。

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64)) 
RETURNS setof record 
AS 
$$ 
    SELECT u.name 
     , u.description 
    FROM table_a u 
    WHERE u.name = COALESCE($1, u.name); 

$$ 
LANGUAGE sql; 

此行爲手冊中記載:http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

所以就SQL函數本身而言,這些名字只是裝飾;你還必須參考的參數爲$ 1,$ 2等函數體內

編輯

由於9.2版本,可以使用命名參數與(普通)SQL函數
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS