Сравните, когда значение может быть как NULL или как текст - PullRequest
5 голосов
/ 06 октября 2010

Теперь я знаю, что вы не можете напрямую сравнивать NULL ни с чем (так как null неизвестен), так как бы мне добиться следующего:

select  *
    from    Material as m
    where   MtrlCode = 826 and
            Exposlimit <> 'compareMe'

Где Exposlimit МОЖЕТ быть НЕДЕЙСТВИТЕЛЕН или не может быть. «CompareMe» также может быть NULL.

Поэтому как мне сравнить два? Обе стороны могут быть либо текстом, либо NULL.

Ответы [ 5 ]

5 голосов
/ 06 октября 2010
select  * 
from    Material as m 
where   MtrlCode = 826 
    and (Exposlimit <> 'compareMe'
         or (Exposlimit is null and compareme is not null) 
         or (Exposlimi is not null and compareme is null))
2 голосов
/ 06 октября 2010

Используйте функцию IFNULL для таких случаев.

т.е.

ГДЕ IFNULL (FieldA, «MagicConstant») = IFNULL (FieldB, «MagicConstant»)

1 голос
/ 06 октября 2010
select  *
    from    Material as m
    where   (MtrlCode = 826 or MtrlCode IS NULL)  and
            (Exposlimit <> 'compareMe' or Exposlimit IS NULL)
0 голосов
/ 03 ноября 2012

Учтите, что легче найти равенство:

(Column = @Value or (Column is null and @Value is null))

Что приводит к истине, когда оба значения равны.В идеале мы могли бы отрицать это утверждение, чтобы найти неравенство, но логика SQL в трех состояниях нарушает эту идею, как NOT(UNKNOWN) = UNKNOWN

--DO NOT USE, broken
NOT (Column = @Value or (Column is null and @Value is null))

Следовательно, если мы проверяем только значение TRUEи отрицая это, мы все равно получим читаемую операцию.

CASE WHEN Column is null and @Value is null or Column = @Value THEN 1 ELSE 0 END = 0
0 голосов
/ 06 октября 2010

Вы пробовали это?

select  *
    from    Material as m
    where   MtrlCode = 826 and
            Exposlimit IS NOT NULL AND 'compareMe' IS NOT NULL AND Exposlimit <> 'compareMe'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...