Как использовать SQL Comparator в базовом селекторе «Case» в логи «Когда» c без необходимости переписывать условия - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть запрос SQL к нескольким таблицам (все ВНУТРЕННИЕ СОЕДИНЕНИЯ).

Ниже приведен пример запроса, который я пытаюсь выполнить (? - это проиллюстрируем позицию, в которой я предполагаю, что ответ на мой вопрос будет исправлен).

Case 
    (
        SELECT Count(ID)
        FROM CPD_Candidates cpdCan
        WHERE
            cpdCan.CandidateID = can.CandidateID
        AND
            (
                cpdCan.DateEnded >= GETDATE()
            OR
                coalesce(cpdCan.DateEnded, '') = N'1-Jan-1900'
            )
        AND
            cpdCan.Deleted <> 1
    )
    When ? > 0 then 'Bigger' else 'Equal or Smaller' End
)

Идея, изложенная выше, заключается в том, что вместо ? фактическое значение, которое я хочу сравнить значение против будет Count(ID), если оно больше 0, я хочу, чтобы он ВЫБРАЛ «Больше», в противном случае он должен ВЫБРАТЬ «Равно или Меньше». Таким образом, более точное описание того, что я буду sh запускать, будет ниже.

Case 
    (
        SELECT Count(ID)
        FROM CPD_Candidates cpdCan
        WHERE
            cpdCan.CandidateID = can.CandidateID
        AND
            (
                cpdCan.DateEnded >= GETDATE()
            OR
                coalesce(cpdCan.DateEnded, '') = N'1-Jan-1900'
            )
        AND
            cpdCan.Deleted <> 1
    )
    When 
         Count(cpdCan.ID) > 0 then 'Bigger' else 'Equal or Smaller' End
)

Конечно, есть синтаксическая ошибка выше, но я спрашиваю, можно сравнить, как в приведенной выше структуре запроса SQL, но заменив Count(cpdCan.ID) > 0 другими средствами для достижения этого значения & logi c?

Если это невозможно в SQL Server 2016, что другие средства были бы лучшим решением для этого XY?

1 Ответ

0 голосов
/ 09 апреля 2020

Я думаю, что вы имеете в виду:

case when
    (
        SELECT Count(ID)
        FROM CPD_Candidates cpdCan
        WHERE 
            cpdCan.CandidateID = can.CandidateID
            AND (cpdCan.DateEnded >= GETDATE() OR coalesce(cpdCan.DateEnded, '') = N'1-Jan-1900')
            AND cpdCan.Deleted <> 1
    ) > 0
    then 'Bigger' 
    else 'Equal or Smaller' 
End
...