我有一张这样的表:
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)
但是立即失败,“错误:语法错误在'或'附近'。”
提前致谢!
答案 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
运算符