数组列包含其他数组列的值

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

如何要求一个数组列具有另一个数组列的所有值?

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 项目测试中寻找线索,但都没有运气。

arrays h2
1个回答
0
投票

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,并且不会选择该行。

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