Проверка SQL для NULL в предложении WHERE (троичный оператор?) - PullRequest
2 голосов
/ 10 февраля 2011

Каким будет SQL-эквивалент этого оператора C #?

bool isInPast = (x != null ? x < DateTime.Now() : true)

Мне нужно создать предложение WHERE, которое проверяет, что x < NOW() только если x IS NOT NULL.x - это datetime, который иногда должен быть нулевым, а не нулевым в других случаях, и я только хочу, чтобы предложение WHERE учитывало ненулевые значения и считало нулевые значения истинными.

Прямо сейчас это предложение:

dbo.assignments.[end] < { fn NOW() }

, которое работает для случаев, отличных от NULL, но значения NULL, кажется, всегда делают выражение оцениваемым как ложное.Я попытался:

dbo.assignments.[end] IS NOT NULL AND dbo.assignments.[end] < { fn NOW() }

И это, кажется, не имеет никакого эффекта.

Ответы [ 4 ]

5 голосов
/ 10 февраля 2011

Для использования в предложении WHERE вы должны тестировать отдельно

where dbo.assignments.[end] is null or dbo.assignments.[end] < GetDate()

или вы можете превратить нули в дату (это всегда будет верно)

where isnull(dbo.assignments.[end],0) < GetDate()

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

where case when dbo.assignments.[end] < GetDate() then 0 else 1 end = 1


Ниже приведено объяснение и способ получения isInPast для предложения SELECT.

bool isInPast = (x! = Null? X

bool может иметь только один из двух результатов, true или false.
При внимательном рассмотрении ваших критериев условие ONLY для - это когда

x! = Null && x

Учитывая этот факт, он становится простым переводом, учитывая, что в SQL x < now может оцениваться только при x!=null, поэтому требуется только одно условие

isInPast = case when dbo.assignments.[end] < { fn NOW() } then 0 else 1 end

(1 - истина, а 0 - ложь)

Не уверен, что представляет { fn NOW() }, но если вы хотите, чтобы SQL Server предоставлял текущее время, используйте либо GETDATE (), либо, если вы работаете с данными UTC, используйте GETUTCDATE ()

isInPast = case when dbo.assignments.[end] < GetDate() then 0 else 1 end
0 голосов
/ 10 февраля 2011

Вам нужно что-то вроде

WHERE X IS NULL
OR X < NOW()
0 голосов
/ 10 февраля 2011

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

0 голосов
/ 10 февраля 2011

Вероятно, вы ищете CASE оператор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...