SQL, где Column1 = Column1 будет возвращать только ненулевые - PullRequest
2 голосов
/ 29 октября 2011

Я работаю над более крупной проблемой, но сузил ее до этого, чтобы было проще задать этот вопрос.

Следующий запрос:

Select * from User where Country = Country 

Будетвозвращать только те строки, где Country не равен NULL.Я ожидаю, что если Column1 равен нулю, он вернет его, потому что NULL = NULL.

Любые данные о том, почему это не работает, как я ожидаю?

РЕДАКТИРОВАТЬ:

Я пытаюсь сделать это:

Select * from User where Country = coalesce(@Country, Country)

Если мойпеременная @Country равна нулю, я хочу, чтобы она все потянула.

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

SQL использует трехзначную логику (true, false, unknown) и сравнения с NULL (за исключением тестирования с оператором IS [NOT] NULL) оцениваются как unknown, а не true, пока включена опция сеанса ANSI_NULLS.

Чтобы строка из вашего запроса была возвращена, предложение WHERE должно иметь значение true.

После редактирования вы можете использовать

Select * 
from User 
where @Country is null or Country = @Country
option (recompile)

Чтобы вернуть все строки, когда @country is null. Хотя, вероятно, лучше разбить их на 2 случая, чтобы избежать штрафа за перекомпиляцию.

IF @Country is null
Select * 
from User 
ELSE
Select * 
from User 
Where Country = @Country
1 голос
/ 29 октября 2011

NULL никогда не равно NULL, поэтому, когда Страна имеет значение NULL, Страна! = Страна

Вы проверяете NULL с помощью оператора IS.

Если вам действительно нужны значения NULL (а я действительно не понимаю, почему вы; во-первых, вам нужен такой запрос), попробуйте ..

select * from User where IFNULL(Country, '') = IFNULL(Country, '')

или

select * from User where Country = Country or Country IS NULL

...