Получить значение из другой таблицы, если условие не выполнено

Пишу 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 'мгу'. Если @Date находится между msu.DateFrom и msu.DateTo, отобразить msu.Status. В противном случае отобразите r.Status.

Я уже сделал левое соединение для Register.MonitoringStatusOfUser. Однако я не могу понять, как отображать r.Status, если условие @Date, которое я объяснил выше, не выполняется.

0
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, нужен ли 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)

Эй, спасибо за это. Однако мне нужно отобразить только один статус - если условие для @Date выполнено, то показать статус из Register.MonitoringStatusOfUser. Если нет, то покажите статус из Register.Resident.

Bernard Polman 31.10.2018 13:27

Мне очень жаль, я неправильно прочитал код! Большое спасибо, это работает.

Bernard Polman 31.10.2018 13:33

Другие вопросы по теме