2010-10-06 40 views
5

Bây giờ tôi biết bạn không thể trực tiếp so sánh NULL để bất cứ điều gì (như rỗng không rõ) vậy làm thế nào tôi sẽ đạt được như sau:Hãy so sánh khi giá trị có thể là cả hai NULL hoặc văn bản

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

đâu Exposlimit CÓ THỂ được NULL hoặc nó có thể không. 'compareMe' cũng có thể là NULL.

Vì vậy, làm cách nào để so sánh cả hai? Cả hai bên có thể là văn bản hoặc NULL.

Trả lời

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

Hoạt động đẹp, cảm ơn rất nhiều. –

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

Sử dụng hàm IFNULL cho các trường hợp như vậy.

ví dụ:

ĐÂU IFNULL (FieldA, 'MagicConstant') = IFNULL (FieldB, 'MagicConstant')

+0

IFNULL có tồn tại trong T-SQL không? Ngay cả khi bạn sử dụng ISNULL, trình tối ưu hóa sẽ đấu tranh để sử dụng bất kỳ chỉ mục nào bạn có thể đã xác định. –

+0

@Paul, có sql-server không có chỉ mục dựa trên chức năng và cách giải quyết (http://www.sqlservercentral.com/scripts/T-SQL+Aids/31906/) trông rất xấu. –

0

Bạn đã thử này?

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

Hãy xem xét rằng đó là dễ dàng hơn để tìm thấy sự bình đẳng:

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

nào dẫn đến đúng khi cả hai giá trị đều bình đẳng. Chúng tôi sẽ lý tưởng có thể phủ nhận tuyên bố này để tìm sự bất bình đẳng, nhưng logic tri-state của SQL phá vỡ ý tưởng rằng, như NOT(UNKNOWN) = UNKNOWN

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

Do đó, nếu chúng tôi kiểm tra chỉ có giá trị TRUE, và phủ nhận nó, chúng tôi vẫn kết thúc với một hoạt động có thể đọc được.

CASE WHEN Column is null and @Value is null or Column = @Value THEN 1 ELSE 0 END = 0 
Các vấn đề liên quan