Postgres函数与文本数组并选择查询中的位置

时间:2014-10-08 08:13:42

标签: arrays postgresql where plpgsql

我需要创建一个这样的函数(缩小到最小),我发送一个应该匹配的字符串数组。但我不能让查询起作用。

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||')';

那么如何将参数作为数组使用呢? 与让参数成为字符串相比,这会更好还是更差?

3 个答案:

答案 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,','));

效率仍未得到解决。