2010-02-25 19 views
7

Tôi gặp một tình huống lạ khi cố đếm số hàng KHÔNG có giá trị varchar được chỉ định bởi câu lệnh chọn. Ok, điều đó nghe có vẻ khó hiểu ngay cả với tôi, vì vậy hãy để tôi cung cấp cho bạn một ví dụ:COUNT() Chức năng kết hợp với mệnh đề NOT IN không hoạt động đúng với trường varchar (T-SQL)

Giả sử tôi có trường "MyField" trong "SomeTable" và tôi muốn tính số lượng hàng MyField giá trị không thuộc về miền được xác định bởi các giá trị của "MyOtherField" trong "SomeOtherTable". Nói cách khác, giả sử rằng tôi có MyOtherField = {1, 2, 3}, tôi muốn đếm số lượng hàng MyField không phải là 1, 2 hoặc 3. Đối với điều đó, tôi sẽ sử dụng truy vấn sau:

SELECT COUNT(*) FROM SomeTable 
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable)) 

Và nó hoạt động như một sự quyến rũ. Tuy nhiên, lưu ý rằng MyField và MyOtherField được nhập vào. Nếu tôi cố gắng chạy chính xác cùng một truy vấn, ngoại trừ các trường được nhập varchar, giá trị trả về của nó là 0 mặc dù tôi biết rằng có giá trị sai, tôi đặt chúng ở đó! Và nếu tôi, tuy nhiên, cố gắng đếm ngược lại (bao nhiêu hàng trong miền đối lập với những gì tôi muốn có bao nhiêu hàng không) đơn giản bằng cách nhấn mạnh mệnh đề "NOT" trong truy vấn ở trên ... Vâng, R THNG công trinh! ¬¬

Vâng, phải có rất nhiều cách giải quyết cho vấn đề này nhưng tôi muốn biết tại sao nó không hoạt động theo cách cần thiết. Hơn nữa, tôi không thể thay đổi toàn bộ truy vấn vì hầu hết nó được xây dựng bên trong mã C# và về cơ bản phần duy nhất tôi có quyền tự do thay đổi sẽ không có tác động trong bất kỳ phần nào khác của phần mềm là câu lệnh chọn tương ứng với miền (bất kỳ điều gì có trong mệnh đề NOT IN). Tôi hy vọng tôi đã làm cho bản thân mình rõ ràng và ai đó ra có thể giúp tôi ra ngoài.

Xin cảm ơn trước.

+1

Bạn có dấu NULL trong "SomeOtherTable" cho trường đó không? –

Trả lời

6

Đối với NOT IN, sẽ luôn sai nếu truy vấn phụ trả về giá trị NULL. Câu trả lời được chấp nhận cho this question mô tả chi tiết lý do tại sao.

giá trị null của một giá trị cột không phụ thuộc vào kiểu dữ liệu sử dụng quá: rất có thể cột VARCHAR của bạn có giá trị NULL

Đừng đối phó với điều này, sử dụng không tồn tại. Đối với các giá trị không null, nó hoạt động giống như NOT IN như vậy là tương thích

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField) 
+0

Cảm ơn bạn, bằng cách sử dụng truy vấn được đề xuất của bạn với mệnh đề NOT EXISTS đã thực hiện những gì tôi muốn. –

0

gbn có câu trả lời hoàn chỉnh hơn, nhưng tôi không thể nhớ hết tất cả. Thay vào đó, tôi có thói quen tôn giáo để lọc các số không trong số các mệnh đề IN của mình:

SELECT COUNT(*) 
FROM SomeTable  
WHERE [MyField] NOT IN (
    SELECT MyOtherField FROM SomeOtherTable 
    WHERE MyOtherField is not null 
) 
Các vấn đề liên quan