2009-10-28 46 views
26

Tôi có mã sau trong một thủ tục được lưu trữ.Tuyên bố không giống SQL không hoạt động

WHERE 
    WPP.ACCEPTED = 1 AND 
    WPI.EMAIL LIKE '%@MATH.UCLA.EDU%' AND 
    (WPP.SPEAKER = 0 OR 
    WPP.SPEAKER IS NULL) AND 
    WPP.COMMENT NOT LIKE '%CORE%' AND 
    WPP.PROGRAMCODE = 'cmaws3' 

Câu lệnh NOT LIKE không hoạt động và có trước khi bất kỳ ai nói có các mục có cột COMMENT không bao gồm CORE và tất cả các cột khác đều ổn.

Có ai biết điều gì sai với điều này không?

+2

Bạn có ý nghĩa gì khi "không hoạt động"? Ném một ngoại lệ? Hay luôn luôn được đánh giá là sai? – Tenner

+0

Bạn có thể vui lòng đăng các giá trị liên quan của một hàng mà theo ý kiến ​​của bạn nên được trả lại nhưng không? – Quassnoi

+0

@mattgcon nếu bạn nhận được câu trả lời trả lời câu hỏi bạn đã hỏi, vui lòng "chấp nhận" câu trả lời bằng cách nhấp vào dấu kiểm bên dưới số phiếu bầu. –

Trả lời

43

Nếu WPP.COMMENT chứa NULL, điều kiện sẽ không khớp.

truy vấn này:

SELECT 1 
WHERE NULL NOT LIKE '%test%' 

sẽ trở lại không có gì.

Trên cột NULL, cả hai LIKENOT LIKE đối với bất kỳ chuỗi tìm kiếm nào sẽ trả về NULL.

Bạn có thể vui lòng đăng các giá trị liên quan của một hàng mà theo ý kiến ​​của bạn nên được trả lại nhưng không?

6

Giá trị của cột COMMENT cụ thể của bạn có bị vô hiệu không?

Đôi khi NOT LIKE không biết cách xử lý đúng khoảng trống.

0

mattgcon,

nên làm việc, làm bạn nhận được nhiều hàng nếu bạn chạy các lệnh SQL tương tự với dòng "KHÔNG THÍCH" nhận xét ra? Nếu không, hãy kiểm tra dữ liệu. Tôi biết bạn đã đề cập trong câu hỏi của bạn, nhưng hãy kiểm tra xem câu lệnh SQL thực tế có đang sử dụng mệnh đề đó hay không. Các câu trả lời khác với NULL cũng là một ý tưởng tốt.

5

Tôi vừa gặp vấn đề tương tự và giải quyết nó, nhưng không phải trước khi tôi tìm thấy bài đăng này. Và nhìn thấy như câu hỏi của bạn đã không được thực sự trả lời, đây là giải pháp của tôi (mà hy vọng sẽ làm việc cho bạn, hoặc bất cứ ai khác tìm kiếm điều tương tự tôi đã làm;

Thay vì;

... AND WPP.COMMENT NOT LIKE '%CORE%' ... 

Hãy thử;

... AND NOT WPP.COMMENT LIKE '%CORE%' ... 

về cơ bản di chuyển "KHÔNG" phía bên kia của lĩnh vực tôi đang đánh giá làm việc cho tôi.

+3

Chào mừng bạn đến với stackoverflow. Trên thực tế, vẫn không bao gồm null, đó là hành vi đúng bởi vì 'null' không bằng bất cứ thứ gì, thậm chí không phải chính nó. Nếu bạn muốn bao gồm các giá trị rỗng, hãy thêm một điều kiện tức là 'OR Column IS NULL' hoặc sử dụng' COALESCE' để giá trị không bao giờ là rỗng. – Leigh

3

Chỉ cần đi qua này, câu trả lời rất đơn giản, sử dụng ISNULL. SQL sẽ không trả lại hàng nếu trường bạn đang thử nghiệm không có giá trị (trong một số hồ sơ) khi thực hiện một tìm kiếm so sánh văn bản, ví dụ:

WHERE wpp.comment NOT LIKE '%CORE%' 

Vì vậy, bạn đã tạm thời thay thế một giá trị trong null (trống) các bản ghi bằng cách sử dụng lệnh ISNULL, ví dụ:

WHERE (ISNULL(wpp.comment,'')) NOT LIKE '%CORE%' 

Sau đó sẽ hiển thị tất cả các bản ghi có giá trị rỗng và bỏ qua bất kỳ tiêu chí nào phù hợp với bạn.Nếu bạn muốn, bạn có thể đặt thứ gì đó vào dấu phẩy để giúp bạn nhớ, ví dụ:

WHERE (ISNULL(wpp.comment,'some_records_have_no_value')) NOT LIKE '%CORE%' 
Các vấn đề liên quan