首页 > 解决方案 > PostgreSQL 数组与 ALL 结构重叠

问题描述

我想实现与下一个示例相同的行为:

select array[1, 3] && array[1] and array[1, 3] && array[2]

像这样使用ALL构造:

select array[1, 3] && all(select array[array[1], array[2]])

按照逻辑,两个查询都应该返回false,但只有第一个会返回,而第二个查询会返回true

任何人都可以解释这种行为并提示我如何解决它吗?

标签: sqlarrayspostgresql

解决方案


与其传递单个多维数组,不如传递一组一维数组——或者实际上是任何维度,因为在这种情况下,维度只是噪声。这有效:

SELECT ARRAY[1,3] && ALL ((SELECT ARRAY[1] UNION ALL SELECT ARRAY[2]));  -- false

应用于表列时更有用:

SELECT ARRAY[1,3] && ALL ((SELECT array_column FROM some_tbl));

ALLor构造在右边ANY期望一个集合或一个数组。您的示例仅适用于set。我可以看到人们如何得出结论来传递一个多维数组(一个数组数组)。不幸的是,它不是这样工作的。手册

评估左侧表达式并与数组的每个元素进行比较[...],

大胆强调我的。元素。不是子数组或数组切片。所以尝试:

SELECT ARRAY[1,3] && ALL (ARRAY[ARRAY[1], ARRAY[2]]);  -- error
-- identical, more explicit:
SELECT '{1,3}'::int[] && ALL ('{{1},{2}}'::int[]);  -- error

...相应地导致此错误消息:

ERROR:  operator does not exist: integer[] && integer

你在两者之间尝试了一些东西:

SELECT ARRAY[1,3] && ALL(SELECT ARRAY[ARRAY[1], ARRAY[2]]);  -- true
-- identical, more explicit:
SELECT '{1,3}'::int[] && ALL (SELECT '{{1},{2}}'::int[]);  -- true

实际上是一个包含单个多维数组的集合。它归结为:

SELECT '{1,3}'::int[] && '{{1},{2}}'::int[];  -- true

...这会产生像您观察到的那样,因为再次在元素true级别上测试“重叠” ,而忽略维度。实际上与以下内容相同:

SELECT '{1,3}'::int[] && '{1,2}'::int[];  -- true

或者,为了证明我的观点:

SELECT '{{{1}},{{3}}}'::int[] && '{{1},{2}}'::int[];  -- true

有关的:


推荐阅读