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

时间:2017-12-22 21:06:26

标签: sql postgresql postgresql-9.6

我有一张这样的表:

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)

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

提前致谢!

1 个答案:

答案 0 :(得分: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运算符