【发布时间】:2019-12-13 19:20:31
【问题描述】:
考虑一个简单的 where 子句
select * from table_abc where col_a in (1,2,3)
我知道现在的情况
- 如果 1,2,3 不存在,我将不会得到任何结果
- 如果存在 1,2,3,我将获得与 1,2,3 相关的所有结果
- 如果 1 存在而 2,3 不存在,我将只得到与 1 相关的结果。
我的问题是我们是否可以执行条件查询
-
如果 1 存在而 2,3 不存在,我仍然应该得到与 1,2,3 相关的所有结果
-
但是,如果没有1,2,3,我不会得到任何结果
换句话说,我可以将 where-in 子句中的特定值设置为强制吗?我们如何更改当前查询?
编辑:正如评论中指出的,我忘了添加表结构。我最好也解释一下用例。
表 1:管理员
ID admin_id
-------------
1 001
2 002
表 2:事件
ID event_id
-------------
1 110
2 220
表 3:Admins_Events
admin_id event_id
-------------
001 110
001 220
002 220
现在,作为过滤的一部分,假设我有查询
SELECT "admins"."admin_id", "events"."event_id" FROM "admins"
LEFT JOIN "admins_events" ON "admins_events"."admin_id" = "admins"."admin_id"
LEFT JOIN "events" ON "events"."event_id" = "admins_events"."event_id"
WHERE (events.event_id IN (110) AND admins.admin_id IN (001))
目前,我得到的结果是
admin_id event_id
-------------
001 110
我想要的东西在哪里
admin_id event_id
-------------
001 110
001 220
即使我没有在 where-in 子句中传递它,我仍然必须显示与管理员相关的其他事件。我想每次都传递所有 event_id 并匹配强制 event_id 并匹配剩余的 event_ids,以防找到强制 event_id。
SELECT "admins"."admin_id", "events"."event_id" FROM "admins"
LEFT JOIN "admins_events" ON "admins_events"."admin_id" = "admins"."admin_id"
LEFT JOIN "events" ON "events"."event_id" = "admins_events"."event_id"
WHERE (events.event_id IN (mandatory[110], 220) AND admins.admin_id IN (001))
如何更改查询?
【问题讨论】:
-
数据不存在时如何获取数据?
-
缺席什么?整张桌子?
col_a中只有一个值,因此它们中的两个或更多将始终不存在于一行中。 -
将 events.event_id 条件从 WHERE 移动到 ON 以获得真正的 LEFT JOIN 结果。 (现在你会得到常规的内部连接结果。)
-
@jarlh 你能详细说明你的答案吗?
-
您使用的是 Postgres 还是 MySQL?请只标记您真正使用的数据库。
标签: sql postgresql where-clause where-in