PostgreSQL多列WHERE = ANY(ARRAY)

时间:2019-03-06 17:42:37

标签: sql postgresql

我有一个包含三列的表,分别是“ id”,“ letter”和“ number”。我有一个“字母”和“数字”对的列表,为此我需要在单个查询中获取“ id”。显然,简单的解决方案是使用n个查询,其中n是列表的大小。

class="tp-container rev_slider_wrapper fullwidthbanner-container"

但这需要n个查询,在我的情况下,它是数百万个,并且开销很大。以前,我只对“数字”列表进行过滤,所以我使用了

SELECT id FROM table WHERE number=... AND letter=...

有没有可以满足我需要的语法,例如

SELECT id FROM table WHERE number = ANY(ARRAY[...])

谢谢。

2 个答案:

答案 0 :(得分:2)

虽然您可以肯定地将数组与<@ (is-contained-by)运算符或ANY operator一起使用,但是您不需要数组。固定值JOIN的运行肯定比其他选项快得多。

将以下test表与数据一起考虑:

CREATE TEMP TABLE IF NOT EXISTS 
    test(id SERIAL, letter TEXT, num NUMERIC);

WITH letters AS (
    SELECT chr(generate_series(65, 90)) AS letter
)
,numbers AS (
    SELECT generate_series(101, 999) AS num 
)
INSERT INTO test(letter, num)
SELECT  letter, num 
FROM    letters, numbers

您现在可以将值添加到查询中并执行JOIN。例如,以下查询找到对('A',105),('B',110)和('C',879)中的id

SELECT  id
FROM    test T
    JOIN (VALUES    /* your query criteria goes here */
        ('A', 105)
       ,('B', 110)
       ,('C', 879)
    ) AS V(l, n) 
        ON T.letter = V.l AND T.num = V.n 

哪个返回值(假设未对测试表进行任何先前的写操作):

id  |
----|
   5|
 909|
2577|

答案 1 :(得分:0)

您可以使用行数组:

select id from table where (letter, number) = any(array[(l1, n1), (l2, n2), ...])

(如果您已设置为使用= any)。您可能需要包括很多类型转换,以确保所有内容都对齐,因此与加入VALUES列表相比可能更难看。