2010-03-22 68 views
10

Làm thế nào để kiểm tra một giá trị IS NULL [or] = @param (nơi @ param là null)IS NULL vs = NULL trong mệnh đề where + SQL Server

Ex:

Select column1 from Table1 
where column2 IS NULL => works fine 

Nếu tôi muốn thay thế giá trị so sánh (IS NULL) với @param. Làm cách nào để thực hiện điều này

Select column1 from Table1 
where column2 = @param => this works fine until @param got some value in it and if is null never finds a record. 

Làm cách nào để đạt được điều này?

Trả lời

31
select column1 from Table1 
    where (@param is null and column2 is null) 
    or (column2 = @param) 
2

Không có phương pháp truy vấn "một kích thước phù hợp với tất cả" cho điều này, có những tác động về hiệu suất tinh tế trong cách bạn thực hiện việc này. Nếu bạn muốn đi ngoài chỉ làm cho truy vấn trả lại câu trả lời đúng, bất kể như thế nào chậm nó là, nhìn vào bài viết này trên Dynamic Search Conditions in T-SQLby Erland Sommarskog

đây là một liên kết đến các phần trên x = @x OR @x IS NULL

1
WHERE ((COLUMN1 = @PARAM) OR (COLUMN1 IS NULL AND @PARAM IS NULL)) 
+1

'COLUMN = @ PARAM' sẽ không bao giờ đúng nếu' @ PARAM' là rỗng, vì vậy điều kiện thứ hai ('@PARAM IS NOT NULL') không cần thiết. –

+0

@Damien_The_Unbeliever Jun You Right, tôi đã xóa mã dự phòng. Cảm ơn –

0
Select column1 from Table1 
where (column2 IS NULL and @param IS NULL) 
or (column2 IS NOT NULL AND @param IS NOT NULL AND (column2 = @param) ) 
+1

Kiểm tra 'column2 IS NOT NULL' là không cần thiết, vì điều này sẽ được bao gồm bởi' column2 = @ param' ... mà làm cho câu trả lời này là một phiên bản ngắn gọn hơn của câu trả lời được chấp nhận từ năm ngoái. –

+0

câu trả lời từ năm ngoái có điều này: (@param là null và cột2 là null) hoặc (column2 = @param) Nếu @param không rỗng, điều kiện đầu tiên sẽ là false và thứ 2 sẽ chỉ được đánh giá: (column2 = @param) Tôi đã thấy rằng nếu bạn đang kiểm tra những thứ như (column2 = @param) và nó có thể là null, kiểm tra thêm là an toàn hơn để có –

2

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đã có câu hỏi tương tự và đã đưa ra một câu trả lời ngắn hơn. Lưu ý: điều này chỉ có thể làm việc cho MS SQL Server, hỗ trợ ISNULL (expr, thay thế).

SELECT column1 FROM table1 
WHERE ISNULL(column2,'') = ISNULL(@param,'') 

Điều này cũng giả định bạn xử lý NULL và chuỗi rỗng theo cùng một cách.

+1

Nếu bạn thay đổi SQL để sử dụng COALESCE thay vì ISNULL thì sẽ làm việc cho nhiều hơn chỉ SQL Server kể từ khi trước đây là ISO/ANSI được định nghĩa không giống như sau này. –

Các vấn đề liên quan