抱歉,我为手写波浪形的标题感到抱歉,在保持文本简短的同时,我想不出更好的描述。这是完整的问题。
在具有两列的表中,我想选择第一列中的一个条目,该条目具有我在第二列中指定的所有值。这可以通过一个玩具示例(也可以在SQL Fiddle上)更好地解释。
假设我有一个这样的表:
CREATE TABLE t (fruit TEXT, color TEXT);
INSERT INTO t (fruit, color) VALUES
('banana', 'green'),
('banana', 'yellow'),
('apple', 'green'),
('apple', 'red'),
('apple', 'yellow'),
('strawberry', 'green'),
('strawberry', 'red');
给定多种颜色,我需要检索具有所有这些颜色的水果(您可以假设只有一种)-不多也不少。
因此,如果我查询“绿色和红色”,我应该得到“草莓”。但是,如果我查询“绿色和黄色”,则应该看到“香蕉”而不是“苹果”,因为后者也具有其他颜色。
到目前为止,我想出的是一个使用INTERSECT
以下方法的可怕技巧:
WITH cte AS (
SELECT fruit FROM t WHERE color = 'green'
INTERSECT SELECT fruit FROM t WHERE color = 'yellow')
SELECT fruit FROM cte;
当然会失败,因为会同时返回香蕉和苹果。
有人有更好的计划吗?
您可以汇总颜色,并检查汇总后的数组是否等于期望颜色的数组。
SELECT
fruit
FROM t
GROUP BY fruit
HAVING ARRAY_AGG(color ORDER BY color) = '{green, yellow}'
要获得与订单无关的解决方案,您可以例如:
SELECT
fruit
FROM t
GROUP BY fruit
HAVING ARRAY_AGG(color) @> '{yellow, green}'
AND ARRAY_AGG(color) <@ '{yellow, green}'
要么
SELECT
fruit
FROM t
GROUP BY fruit
HAVING ARRAY_AGG(color ORDER BY color) =
(SELECT ARRAY_AGG(unnest ORDER BY unnest) FROM unnest('{yellow, green}'::text[]))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句