在postgresql查询的IN子句中使用变量

时间:2016-06-16 13:21:35

标签: postgresql

我是postgres的新手。我想完成一项简单的任务。

我有如下功能:

create or replace function function1(source json)     
returns json as $$
DECLARE
    output_data json;
begin
    raise notice '%',source::text;
    select json_agg(name_id) into output_data from table1 where channel_id in SOURCE;   -- I want to use SOURCE as dynamic
    return output_data;
end;
$$ LANGUAGE plpgsql;

该函数接受输入json参数(source),我想使用参数运行IN子句。

例如, 当我运行以下内容时:

select function1('[5555558,5555559]'); 

我应该得到类似[11111,22222]的输出--->这些是name_id

完成此任务的一种方法是将SOURCE的所有值插入表(new_table),然后执行以下操作。

select json_agg(name_id) into output_data from table1 where channel_id in (select channel_id from new_table);

我想知道其他更好的技术,例如使用等效的集合或动态查询。

谢谢

1 个答案:

答案 0 :(得分:1)

原则上,这可以使用单个SQL语句完成:

SELECT json_agg(t.name_id)
FROM table1 t
JOIN json_array_elements_text('[5555558,5555559]'::json) j(value)
  ON j.value = t.channel_id::text;

如果你想要一个功能,那么它只是:

CREATE FUNCTION function1 (source json) RETURNS SETOF json AS $$
  SELECT json_agg(t.name_id)
  FROM table1 t
  JOIN json_array_elements_text(source) j(value) ON j.value = t.channel_id::text;
$$ LANGUAGE sql;