Как ссылаться на именованные параметры в функциях Postgres sql?

Postgres noobie здесь.

Я пытаюсь преобразовать хранимый proc SQL Server в функцию Postgres. В настоящее время не удается выяснить, как превратить эту строку SQL в Postgres.

SQL Server:

input: @name = null

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

Postgres:

input: n = null

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

Я получаю сообщение об ошибке " столбец n не существует."Как ссылаться на параметры в операторах select в функциях Postgres?

обновление:

определение 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;

2 ответов


REVISED: как указано в комментариях, этот ответ был точным, когда был написан в начале 2012 года, но именованные параметры поддерживались с v9.2, выпущенный в конце 2012 года.

имена параметров-это просто украшение, когда ваша функция находится в язык SQL. Вы можете использовать параметры по имени в хранимых процедурах, определенных как language plpgsql.

следовательно, вы должны обратиться к args функции, используя $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(, u.name);
$$
LANGUAGE sql;

нельзя использовать именованные параметры в функции, определенной с помощью language=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(, u.name);

$$
LANGUAGE sql;

это поведение задокументировано в руководстве:http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

что касается самой функции SQL, эти имена являются просто украшением; вы все равно должны ссылаться на параметры как $1, $2 и т. д. внутри функции тело

редактировать

начиная с версии 9.2 можно использовать именованные параметры с (простым) SQL function
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS