PostgreSQL - 选择数组并在IN()语句中重用它

时间:2018-01-31 16:41:07

标签: sql postgresql

我想从jsonb对象中选择一个整数数组或一个整数数组,然后在IN()函数中使用该数组中的数据。我想在同一个声明中这样做。我可以创建jsonbinteger[]列。

example: SELECT *
            FROM table
            WHERE id IN(selected array)

我试过

SELECT the array and use: `array_to_string(anyarray, text [, text])`

2 个答案:

答案 0 :(得分:0)

如果你想使用array_to_string值作为IN的标量值,你需要动态sql,所以一个语句不会这样做。

让我们假设:

t=# create table i (c int);
CREATE TABLE
t=# insert into i select generate_series(1,9);
INSERT 0 9

然后:

t=# do $$
declare
 _r record;
begin
 for _r in execute format($l$ select * from i where c in (%s)$l$,(select array_to_string(array[1,2,3],','))) loop
raise info '%',_r;
 end loop;
end;
$$
;
INFO:  (1)
INFO:  (2)
INFO:  (3)
DO

如果您想要一个语句,可以使用= ANY

t=# select * from i where c = any(array[1,2,3]);
 c
---
 1
 2
 3
(3 rows)

IN(subquery)

t=# select * from i where c in(select unnest(array[1,2,3]));
 c
---
 1
 2
 3
(3 rows)

最后通常更有效的是加入值而不是IN,例如:

t=# select i.* from i join (select unnest(array[1,2,3]) u ) j on j.u = i.c;
 c
---
 1
 2
 3
(3 rows)

虽然

不一定是小阵列

答案 1 :(得分:0)

由于Vao Tsun已经回答,最简单的选择将是

SELECT *
    FROM table
    WHERE 
        _id = ANY('{1,4,5}'::int[]);

如果您打算查询另一个表并将结果用于此查询

SELECT * 
   FROM table_2 
   WHERE 
    _id = ANY(
               ARRAY(select _id
                        FROM table_1
                        WHERE col_cond = <condition>
                     )
             )