我有一个包含三列的表,分别是“ 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[...])
谢谢。
答案 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列表相比可能更难看。