mysql - 如果条件不满足,则从其他表中获取值
问题描述
我正在编写一个 SQL 查询:
DECLARE @ResidentID AS INT = NULL
DECLARE @Category AS INT = NULL
DECLARE @ResidentStatus AS INT = NULL
DECLARE @Date AS DATETIME = NULL--'2018-02-27'
SELECT DISTINCT r.Firstname, r.Lastname, r.Active FROM Register.Resident r
LEFT JOIN Register.MonitoringStatusOfUser msu ON msu.ResidentID = r.ID
WHERE (r.ID = @ResidentID OR @ResidentID IS NULL)
Register.Resident 'r' 中的每个居民都有一个名为“Status”的字段,它是一个整数。在表 Register.MonitoringStatusOfUser 中,我记录了每个用户的状态,有点像状态变化的历史。我想要做的是:检查 Register.MonitoringStatusOfUser ' msu '中是否有用户记录。如果@Date 介于msu.DateFrom 和msu.DateTo 之间,则显示msu.Status。如果不是,则显示 r.Status。
我已经为 Register.MonitoringStatusOfUser 进行了左连接。但是,如果不满足我上面解释的@Date 条件,我无法弄清楚如何显示 r.Status。
解决方案
我不确定是否DISTINCT
需要。如果需要,请重新添加。
您可以将日期条件放在ON
子句中。然后使用COALESCE()
获取你想要的状态:
SELECT r.Firstname, r.Lastname, r.Active,
COALESCE(msu.status, r.status) as status
FROM Register.Resident r LEFT JOIN
Register.MonitoringStatusOfUser msu
ON msu.ResidentID = r.ID AND
@Date BETWEEN msu.DateFrom AND msu.DateTo
WHERE (r.ID = @ResidentID OR @ResidentID IS NULL)
推荐阅读
- angular - ngx-bootstrap 弹出框无法正常工作
- android - 片段已经添加,对话框片段?
- java - 使 Apache Poi Word 文件可在 URL 上下载
- c++ - 相同的地址被存储在链表的头部
- c# - c#无法转换匿名类型十进制?[] 转十进制数组
- android - 上传即时应用程序时“无法升级到已安装的应用程序”
- bokeh - 使用滑块动态更新节点颜色和工具提示 - Bokeh 和 NetworkX
- r - 如何清除或删除 R Shiny 中的绘图和数据表
- angular - 如何使用 Angular 7 在某些条件下禁用表格内的行?
- jenkins - 在 Jenkins 上用 SpotBugs 替换 FindBugs 时应该使用哪个插件?