我想实现与下一个示例相同的行为:
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));
ALL
或ANY
构造需要右侧的集合或数组。您的示例仅适用于集合。我可以看到如何得出传递多维数组的结论(数组的数组)。不幸的是,事情并非如此。手册:
左边的表达式被求值并与数组的每个元素进行比较[…],
加粗强调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[]
)