如何要求一个数组列具有另一个数组列的所有值?
DROP TABLE A IF EXISTS;
CREATE TABLE A(foo INT ARRAY, bar INT ARRAY);
INSERT INTO A(foo, bar) VALUES
(ARRAY[1, 2, 3], ARRAY[1, 2]),
(ARRAY[2, 3], ARRAY[1, 2, 3]);
SELECT foo FROM A WHERE foo <contains all values of bar>;
// [1, 2, 3]
如果我可以获得数组的不同值,我可以这样做:
WHERE DISTINCT(foo || bar) = foo
因为如果连接 foo 和 bar 不会添加更多值,则 bar 的值必须已经在 foo 中。
问题似乎我无法使用各种函数 UNIQUE、DISTINCT、EXISTS、INTERSECTS 等,因为它们对整个数组值起作用,而我需要比较内部的值。我尝试过使用 TABLE、UNNEST 并在 h2 项目测试中寻找线索,但都没有运气。
UNNEST
函数中我可以看到,这样的东西应该可以工作:
SELECT DISTINCT t1.foo
FROM A t1
WHERE NOT EXISTS (
SELECT *
FROM UNNEST(t1.bar) AS barValue
WHERE NOT EXISTS (
SELECT *
FROM UNNEST(t1.foo) AS fooValue
WHERE fooValue = barValue
)
);
注意:在外部查询中,使用“
NOT EXISTS
”子句来确保我们只选择bar
中存在foo
中的所有值的行。
bar
中存在 foo
中不存在的任何值,则“NOT EXISTS
”条件将为 false,并且不会选择该行。