我需要创建一个这样的函数(缩小到最小),我发送一个应该匹配的字符串数组。但我不能让查询起作用。
create or replace function bar(x text[]) returns table (c bigint) language plpgsql as $$
begin
return query select count(1) as counter from my_table where my_field in (x);
end;$$;
并像这样称呼它
select * from bar(ARRAY ['a','b']);
我可以尝试让参数x为单个文本字符串,然后使用类似
的内容return query execute 'select ... where myfield in ('||x||')';
那么如何将参数作为数组使用呢? 与让参数成为字符串相比,这会更好还是更差?
答案 0 :(得分:3)
是的,数组是 clean 表单。字符串匹配会留下分隔符和模式组合匹配的极端情况......
要查找与给定模式的任何匹配的字符串,请使用ANY
构造:
CREATE OR REPLACE FUNCTION bar(x text[])
RETURNS bigint LANGUAGE sql AS
$func$
SELECT count(*) -- alias wouldn't visible outside function
FROM my_table
WHERE my_field = ANY(x);
$func$;
count(*)
略快于count(1)
。结果相同。
注意,我使用的是纯SQL函数(而不是plpgsql)。要么有其优点和缺点。
答案 1 :(得分:1)
在unnest
的帮助下解决了将数组转换为集合的问题(顺便说一下,函数不必是plpgsql):
CREATE OR REPLACE FUNCTION bar(x text[]) RETURNS BIGINT LANGUAGE sql AS $$
SELECT count(1) AS counter FROM my_table
WHERE my_field IN (SELECT * FROM unnest(x));
$$;
答案 2 :(得分:0)
使用
似乎可以解决使用数组的问题return query select count(1) as counter from my_table where my_field in (array_to_string(x,','));
效率仍未得到解决。