sql - 根据与数组列的比较选择关联记录
问题描述
假设有下表的假设场景
Vehicles
+----+--------+
| id | number |
+----+--------+
| 1 | v1 |
| 2 | v2 |
| 3 | v3 |
+----+--------+
Users
+-----+------+-------------+
| id | name | vehicle_ids |
+-----+------+-------------+
| 100 | u1 | {1} |
| 200 | u2 | {1,2} |
| 300 | u3 | {2,3} |
| 400 | u4 | {} |
+-----+------+-------------+
鉴于number
车辆,我正在寻找返回与该车辆关联的所有用户的查询,
- 其中 vehicle_ids 包含车辆的 id
- 其中 vehicle_ids 只有车辆的 id(即单个元素)
解决方案
我们可以使用ANY
和ALL
构造(更多细节在这里Row and Array Comparisons)
使用“任何”
http://sqlfiddle.com/#!17/ec886/21
对于第一种情况,我们需要返回与搜索查询(以及其他)表示的车辆相关联的用户,我们可以使用 ANY。因此,以下查询将返回带有名称的用户行,u2
并且u3
当v2
作为车辆名称提供时
SELECT "users".*
FROM "users"
WHERE (
(SELECT "vehicles"."id" FROM "vehicles" WHERE "vehicles"."number" = 'v2') =
ANY("users"."vehicle_ids")
)
您可以替换"number" = 'v2'
为任何其他车辆名称以获取与该车辆编号关联的所有用户。
使用“全部”
http://sqlfiddle.com/#!17/ec886/27
对于我们需要完全匹配的第二种情况,即数组中只有一个元素,我们将使用 All。因此,以下查询将仅返回具有名称的用户u1
行v1
SELECT "users".*
FROM "users"
WHERE (
"users"."vehicle_ids" != '{}' and
(SELECT "vehicles"."id" FROM "vehicles" WHERE "vehicles"."number" = 'v1') = ALL("users"."vehicle_ids")
)
如果我们不使用"users"."vehicle_ids" != '{}'
,那么结果也将包含用户u4
笔记:
此子查询方法仅适用于单个车辆,即我们不能这样做WHERE "vehicles"."number" in ('v2', v3)
,因为子查询将返回多行并且 Postgres 将引发错误。我们可能不得不探索unnest
它是否可以达到与原始问题相同的目的,以及它是否足够通用以支持上述用例。
推荐阅读
- python - 按日期进行标记化以按主题进行文本分类
- css - 有没有办法通过父 div 来缩放高度和宽度?
- ios - 在 Swift 中以编程方式返回到早期的 UIViewController
- nlp - 如何在 GSDMM 中获取文本属于某个主题的概率?
- python - 在 bash 脚本中从 Python 返回数组值的最佳方法是什么?
- c - CS50 PSet4 - 模糊滤镜,我得到黑色图像作为输出
- reactjs - 如何使用从 createEntityAdapter 生成的 selectById 选择器
- excel - 如何在 Excel 中对所有玩过的 yahtzy 游戏进行“统计”?
- javascript - 如何禁用浏览器的自动完成功能
- javascript - 我需要 Javascript 帮助更新我网页上的访问次数,以跟踪我的 API 上的点击量