如何在PostgreSQL中将整数列表存储为变量

14

我想知道如何在PostgreSQL存储过程中将整数列表作为变量进行存储。

例如,我有像这样的语句:

   select A from B where C IN (1,2,3);
   select A from B where C IN (1,2);

我想声明一个变量来存储(1,2,3)(1,2)

所以最终我的语句会是像这样的:

select A from B where C in numberList;

(numberList 的值为 (1,2,3))

我不知道应该使用哪种数据类型,我查阅了在线资料,但没有找到在 psql 中有列表类型。那么列表的语法是什么呢?

4个回答

1
你可以将它们存储为整数数组(即 int[] 类型),然后使用 ANY 运算符调用,如下所示:
WITH RECURSIVE CTE AS (
    SELECT 1 AS i
        UNION ALL
    SELECT i+1 FROM CTE WHERE i < 15
)
SELECT * FROM CTE WHERE i = ANY( ARRAY[1, 5, 7, 9] )

这将返回我们所需要的分段动态IN运算符结果:

i
-
1
5
7
9

0

使用此解决方案,您可以在多个查询中使用“变量”。请注意,它实际上是一个函数,但您可以将其用作变量。

还要考虑每次使用它时,函数都会被执行,因此它可能不是最有效的方法,但对于简单的用途,它有助于避免在不同的查询中多次输入或粘贴相同的列表。

CREATE FUNCTION get_constant_array()
RETURNS INTEGER[]
AS $$
BEGIN
    RETURN ARRAY[1,2,3,4];
END;
$$ LANGUAGE plpgsql;

然后你可以像这样使用它:

SELECT get_constant_array();

或者像这样:

SELECT * from sometable where some column in (SELECT get_constant_array) 

注意:此解决方案基于PostgreSQL,虽然我认为它可能也适用于其他方言,只需要稍作更改即可。

另外:使用类似的方法,您也可以存储字符串列表,请告诉我是否需要我编辑我的答案以使用字符串。


0
with myconstants (i) as (values(1),(2),(3))
select A from B, myconstants where C=any(i);

更多阅读材料


0
所说,但更简单:
WITH numberList AS (values (1),(2))
SELECT A FROM B WHERE C = any(select * from numberList)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接