2012-05-02 39 views
16

Làm cách nào để chọn các hàng không bằng một giá trị và cũng bao gồm các giá trị rỗng trong dữ liệu trả về? Tôi đã thử:T-SQL: chọn các hàng không bằng một giá trị, bao gồm cả giá trị rỗng

SET ANSI_NULLS OFF 
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 

tôi muốn trả lại hàng mà không cần phải 'team01' trong cột assignedByTeam nhưng tôi cũng muốn kết quả có chứa null. Thật không may, mã trên không hoạt động (không trả về giá trị rỗng).

Tôi đang sử dụng MS SQL Server 2008 Express.

Trả lời

19

Hãy thử kiểm tra cho NULL một cách rõ ràng:

SELECT TOP 30 col1, col2, ..., coln 
FROM Mails 
WHERE (assignedByTeam <> 'team01' OR assignedByTeam IS NULL) 
+0

+1 đây là vẻ đẹp của logic boolean. – JonH

+1

Vâng, vâng nhưng tôi nghĩ rằng có một cách ngắn hơn để làm điều này, giống như chỉ một lệnh thay vì viết một vài trong số họ. Dù sao, cảm ơn cho những nỗ lực! – Val

+4

@ValCool: Trong tiêu chuẩn SQL có toán tử gọi là 'IS DISTINCT FROM' nhưng SQL Server không hỗ trợ nó. MySQL có toán tử bình đẳng không an toàn null chuẩn 'NOT a <=> b', nhưng SQL Server cũng không thể thực hiện điều này. –

0
where column != 'value' or column is null 
+0

hiện '! =' Hoạt động trong hầu hết các phương ngữ SQL? – MarioDS

+1

@MarioDeSchaepmeester: Có. –

3
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 
OR assignedByTeam is null 
8

Khi bạn có rất nhiều điều kiện, tất cả mọi thứ gõ hai lần stinks. Dưới đây là hai lựa chọn thay thế tốt hơn:

SELECT TOP 30 FROM Mails 
WHERE COALESCE(assignedByTeam,'') <> 'team01' 

Toán tử COALESCE trả về giá trị không rỗng đầu tiên trong danh sách. Nếu assignmentByTeam là NOT null, nó sẽ so sánh giá trị assignByTeam với 'team01'. Nhưng nếu assignmentByTeam IS null, nó sẽ so sánh một trống '' với 'team01'. Đó là cơ bản tốc ký sau:

SELECT TOP 30 FROM Mails 
WHERE (CASE WHEN assignedByTeam IS NULL THEN '' ELSE assignedByTeam END) <> 'team01' 

Cách thứ hai là làm cho tình trạng của bạn có điều kiện, ví dụ:

SELECT TOP 30 FROM Mails 
WHERE 1 = CASE WHEN assignedByTeam = 'team01' THEN 0 ELSE 1 END 

Trong ví dụ này, giá trị ELSE sẽ bao gồm tất cả các hàng null, kể từ khi họ aren 't bằng' team01 '.

+0

Nếu tôi có thể bỏ phiếu hai lần cho điều này, tôi sẽ. – Matt

+0

Có phiếu bầu của tôi. Thumbs up. – MikeJRamsey56

10
SELECT TOP 30 FROM Mails 
WHERE ISNULL(AssignedByTeam,'') <> 'team01' 

Tôi thấy phiên bản câu lệnh kết hợp nhưng ISNULL() hiệu quả hơn.

+1

Đây là giải pháp thanh lịch nhất theo ý kiến ​​của tôi. – Amarundo

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