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

有人能解释这种行为并提示我如何解决吗?

与其传递单个多维数组,不如传递一组一维数组-或者任何维度,因为在这种情况下,维度只是噪声。这项工作:

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));

ALLANY构造需要右侧的集合数组。您的示例仅适用于集合。我可以看到如何得出传递多维数组的结论(数组的数组)。不幸的是,事情并非如此。手册:

左边的表达式被求值并与数组的每个元素进行比较[…],

加粗强调mine。要素不是子数组或数组切片。所以尝试:

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

相关:

PostgreSQL中的IN与ANY运算符

根据Erwin的回答,如果您能够将内部数组表示为字符串,则可以使用以下破解方法:

select array[1, 3] && all(
select string_to_array(unnest(array['1,2', '4,3']), ',')::int[]
)