2008-10-27 38 views
5

Tôi có SQL tuyên bố sau:Tại sao câu lệnh SQL này không hoạt động?

SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%'; 

Nó hoạt động tốt trên Postgres (trả về tên tất cả khác nhau từ nhật ký, mà không phải là trống rỗng và chứa chuỗi '.EDIT'). Nhưng trên Oracle tuyên bố này không hoạt động. Bất kỳ ý tưởng tại sao?

Trả lời

16
SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%'; 

1) Oracle đối xử với '' như NULL, có nghĩa là sự so sánh "không phải là tên = ''" không bao giờ là đúng hay sai; sử dụng "IS NOT NULL" để thay thế. Nhưng ...

2) Điều kiện thứ hai "tên LIKE '% .EDIT%' sẽ không phù hợp với một chuỗi rỗng dù sao, làm cho điều kiện đầu tiên thừa

Vì vậy, tái viết như sau:.

SELECT DISTINCT name FROM log WHERE name LIKE '%.EDIT%'; 
+0

Cảm ơn sự giúp đỡ này.Nó hoạt động tốt Tôi là một thằng ngốc về những thứ thừa, nhưng tôi cũng không biết, taht Oracle đếm '' là NULL. Cảm ơn bạn, bây giờ nó hoạt động. – Mnementh

3

Chuỗi rỗng trong Oracle tương đương với NULL, khiến cho so sánh thất bại. Thay đổi một phần của truy vấn thành NAME IS NOT NULL

2

Bạn có thể viết lại truy vấn đó mà không có mệnh đề "NOT NAME = ''".

SELECT DISTINCT name 
FROM log 
WHERE name LIKE '%.EDIT%'; 

Điều đó có phù hợp với bạn không?

Nếu không, theo cách nào nó không hoạt động? Nó có gây ra lỗi không? Kết quả sai có được trả lại không?

Hãy mở rộng câu hỏi của bạn với thông tin này :-)

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