首页 > 解决方案 > 如果条件不满足,则从其他表中获取值

问题描述

我正在编写一个 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。

标签: mysqlsqldatabase

解决方案


我不确定是否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)

推荐阅读