SQL:检查数组中是否至少有一个元素在子查询中

问题描述 投票:0回答:1

我有这样一张桌子:

id | name | artists
-------------------
1  | XYZ  | {Some Dude, Whatever}
2  | ABC  | {Blah Blah Blah, Whatever}
3  | EFG  | {Running, Out, Of, Made, Up, Names}

我有一个子查询返回一个名为name的列,其中包含一堆艺术家的名字。我需要一种方法来检查artists(对于每一行)的至少一个元素是否包含在该子查询的结果中。也就是说,如果子查询返回:

name
----
Some Dude
Whatever
Blah Blah Blah

那么,我想在我的例子中只选择id为1和2的行,因为子查询中没有返回id 3中的所有艺术家。

我知道我可以做single_element = ANY(subquery),但只测试一个元素。我试过做:

SELECT * FROM table WHERE ANY(artists) = ANY(subquery)

但是,当“错误:语法错误在'或'附近'时,立即失败”。

提前致谢!

sql postgresql postgresql-9.6
1个回答
1
投票

您可以使用&&运算符来测试集合元素重叠。它记录在postgresql documentation section on array functions

WITH artists (name) AS (
VALUES 
    ('Blah Blah Blah'::text), 
    ('Whatever'), 
    ('Some Dude')
),
my_table (id, name, artists) AS (
VALUES 
    (1,'XYZ',ARRAY['Some Dude'::TEXT, 'Whatever'::TEXT]),
    (2,'ABC',ARRAY['Blah Blah Blah', 'Whatever']),
    (3,'EFG',ARRAY['Running', 'Out', 'Of', 'Made', 'Up', 'Names'])
)
SELECT * 
FROM my_table 
WHERE artists && (SELECT ARRAY_AGG(name) FROM artists)

另外,从上面的示例中,您可以看到如何将子查询转换为数组以便能够使用overlaps运算符

© www.soinside.com 2019 - 2024. All rights reserved.