sql - 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));
ALL
or构造在右边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
有关的:
推荐阅读
- python - 启动 Linux 终端并使用 Python 进行控制
- r - 如何用多行(变量)切换多列(年)?
- laravel - update() 函数使访问器在 laravel 中执行两次
- reactjs - 如果我使用扩展运算符,为什么状态会发生变化?
- javascript - 使用套接字和节点发送图像/视频
- reactjs - 如何在数据地图上获得正确的鼠标悬停坐标
- html - 如何覆盖多个 PNG 并让每个 PNG 在其可见区域中都可点击?
- java - 如果 Uid 列表已经在数据库 Firebase ( Android ) 中,请检查
- visual-studio - 如何使用原始解决方案从另一台计算机调试 minidump.mdmp?
- c# - 我需要在表中查询两个重复列中的值