2010-10-06 2 views
5

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

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

Где Exposlimit МОЖЕТ быть NULL или это может быть не так. 'compareMe' также может быть NULL.

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

ответ

5
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)) 
+0

Прекрасно работает, спасибо. –

1
select * 
    from Material as m 
    where (MtrlCode = 826 or MtrlCode IS NULL) and 
      (Exposlimit <> 'compareMe' or Exposlimit IS NULL) 
2

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

т.е.

ГДЕ IFNULL (FieldA, 'MagicConstant') = IFNULL (FieldB, 'MagicConstant')

+0

Существует ли IFNULL в T-SQL? Даже если вы используете ISNULL, оптимизатор будет стараться использовать любые индексы, которые вы, возможно, определили. –

+0

@Paul, да sql-server не имеет функциональных индексов, и обходной путь (http://www.sqlservercentral.com/scripts/T-SQL+Aids/31906/) выглядит очень уродливым. –

0

Пробовали ли вы это?

select * 
    from Material as m 
    where MtrlCode = 826 and 
      Exposlimit IS NOT NULL AND 'compareMe' IS NOT NULL AND Exposlimit <> 'compareMe' 
0

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

(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 
Смежные вопросы