mysql - 通过在特定条件下添加具有特定值的字段从两个表中进行选择
问题描述
Table1: Students
ID Name EternalToken
200901212 Joe xxxxxx
200809922 David yyyyyy
201009122 Chris zzzzzz
Table2: Banned
ID StudentID
1 200901212
我想选择所有学生并显示一个附加字段,表明该学生已通过隐藏 EternalToken 被禁止
SELECT * FROM Students s
LEFT JOIN Banned b
ON s.ID = b.StudentID
这将显示两个表的组合。但是,我希望结果是这样的:
ID Name EternalToken Banned
200901212 Joe NULL 1
200809922 David yyyyyy 0
201009122 Chris zzzzzz 0
只有被禁止的学生才能拥有EternalToken = NULL
请注意,这是我正在努力实现的一个例子,而不是我正在做的事情。Student 和 Banned 只是一个例子,我知道这不是多对多的关系,所以我可以在一张表中实现。但是从技术上回答这个问题将帮助我获得一个灵活的解决方案。
解决方案
您可以使用以下查询:
SELECT
s.ID,
s.Name,
CASE WHEN b.StudentID IS NOT NULL THEN NULL ELSE s.EternalToken END AS EternalToken,
CASE WHEN b.StudentID IS NULL THEN 0 ELSE 1 END AS Banned
FROM Students s
LEFT JOIN Banned b
ON s.ID = b.StudentID;
演示
请注意,这与COALESCE
函数的作用相反。 COALESCE
检查一个值并在该值是 时返回一个替代值NULL
。上面CASE
的令牌表达式检查一个值是否不是 NULL
,并NULL
在这种情况下返回,否则显示永恒的令牌值。
推荐阅读
- mongodb - 如何在mongodb中嵌套查询?
- ajax - 加载 SecurityComponent 时的 CakePHP 3.8 问题
- async-await - 为什么我的 koa 应用程序在使用 Jest/Supertest 测试路由时会超时
- javascript - 未捕获的类型错误:无法读取 null 的属性“addEventListener”找不到问题
- c - 如何将参数传递给 GDB 脚本?
- jpa - 扩展 EntityManager 方法
- xamarin.forms - 更新 xCode 和 vs2019 后所有的签名身份都是未知的
- mysql - mysql触发器 - 将价格与数字相匹配
- node.js - How to refactor multiple 'app.post' with next() to route.post()
- machine-learning - LSTM:多步预测的训练和反向传播