SQLNOT IN
适用于集合。由于您要传递一个数组,请使用<> ALL
.
您必须小心不要将任何NULL
值包含在此类表达式中,因为NULL <> anything
从不计算结果TRUE
,因此从不限定WHERE
子句。
您的函数可能如下所示:
CREATE OR REPLACE FUNCTION get_questions(vcode text[])
RETURNS TABLE(id int, title text, code text)
LANGUAGE sql AS
$func$
SELECT q.id, q.title, q.code
FROM questions q
WHERE q.code <> ALL ($1);
$func$;
称呼:
SELECT * FROM get_questions('{qcode2, qcode2}');
或者(带有数组构造函数的替代语法):
SELECT * FROM get_questions(ARRAY['qcode2', 'qcode2']);
或者你可以使用一个VARIADIC
参数:
CREATE OR REPLACE FUNCTION get_questions(VARIADIC vcode text[]) ...
...并传递一个值列表:
SELECT * FROM get_questions('qcode2', 'qcode2');
细节:
要点:
使用简单的 SQL 函数,因为您的问题中没有任何内容需要 PL/pgSQL 的过程元素。
输入参数是一个文本数组:text[]
要从查询中返回多行,请使用RETURNS TABLE
返回类型。
使用位置参数引用 in 参数,$1
因为按名称引用仅在 9.2 版中针对 SQL 函数引入(与现在某些版本已经存在的 plpgsql 函数相反)。
否则会与子句OUT
中定义的同名参数冲突的表限定列名。RETURNS
LEFT JOIN unnest($1)
/IS NULL
长数组更快(> ~ 80 个元素,这取决于):
SELECT q.id, q.title, q.code
FROM questions q
LEFT JOIN unnest($1) c(code) USING (code)
WHERE c.code IS NULL;
此变体(与上述变体相反)忽略输入数组中的 NULL 值。