2013-06-03 28 views
11

Chỉ cần một câu hỏi về việc xử lý các giá trị null trong một truy vấn.So sánh null/PL SQL/SQL với mệnh đề

Ví dụ tôi có bảng sau với các lĩnh vực sau đây và đánh giá cao

TABLEX 
Column1 
1   
2   
3  
4   
5  
--------- 
Column2 
null 
A 
B 
C 
null 

Tôi đang đi qua một variableY về một thủ tục cụ thể. Bên trong thủ tục là một con trỏ như thế này

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 = variableY 

bây giờ vấn đề là variableY có thể là rỗng A, B hoặc C nếu variableY là null tôi muốn chọn tất cả các kỷ lục mà column2 là null, khác nơi column2, hoặc là A, B hoặc C.

tôi không thể làm con trỏ/truy vấn trên vì nếu variableY là null nó sẽ không làm việc vì sự so sánh nên

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 IS NULL 

trỏ gì/truy vấn tôi nên sử dụng mà sẽ chứa biến số null hoặc chuỗi.

Xin lỗi nếu câu hỏi của tôi hơi khó hiểu. Tôi không giỏi giải thích mọi thứ. Cảm ơn trước.

Trả lời

17

Hoặc tạo SQL khác nhau tùy thuộc vào nội dung của thông số đó, hoặc thay đổi SQL của bạn như thế này:

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL) 
+0

đánh bại tôi một giây :) – Randy

+0

cảm ơn rất nhiều Lasse! làm việc hoàn hảo! cảm ơn tất cả những người đã giúp đỡ. :) – user2447740

0

Hãy thử sử dụng các chức năng ISNULL(). bạn có thể kiểm tra nếu biến là null và nếu có, hãy đặt giá trị trả về mặc định. camparing null to null là không thực sự có thể. nhớ: null <> null

2

Bạn có thể sử dụng một cái gì đó như:

SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '') 

(liên hiệp mất người đầu tiên giá trị NULL phi)

Lưu ý điều này sẽ chỉ làm việc khi bạn nội dung cột không thể '' (chuỗi rỗng). Khác tuyên bố này sẽ thất bại vì NULL sẽ phù hợp với '' (chuỗi rỗng).

(chỉnh sửa) Bạn cũng có thể xem xét:

SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs') 

này sẽ sửa chữa '' thất bại giả thuyết.

+0

Trong Oracle NULL <=> NULL. Vì vậy, ví dụ đầu tiên của bạn chỉ đơn giản là sai. ** [Demo] (http://rextester.com/QBUN21261) ** – lad2025

0

Có thể không phù hợp tùy thuộc vào dữ liệu bạn đang xem, nhưng một mẹo tôi đã thấy (và sử dụng) là so sánh NVL (fieldname, somenonexistentvalue).

Ví dụ, nếu TUỔI là một cột tùy chọn, bạn có thể sử dụng:

if nvl(table1.AGE,-1) = nvl(table2.AGE,-1) 

này dựa trên đó là một giá trị mà bạn biết sẽ không bao giờ được phép. Tuổi tác là một ví dụ tốt, tiền lương, số thứ tự, và các số khác không thể âm. Tất nhiên, các chuỗi có thể phức tạp hơn - bạn có thể nói rằng bạn sẽ không bao giờ có bất kỳ ai có tên 'xyzzymaryhadalittlelamb' hoặc một cái gì đó như thế, nhưng ngày bạn chạy với giả định đó bạn BIẾT họ sẽ thuê một người có tên đó !!

Tất cả những gì đã nói: "nơi a = b hoặc (a là null và b là null)" là cách truyền thống để giải quyết nó.Đó là điều không may, vì ngay cả những người lập trình có kinh nghiệm cũng quên một phần của nó.

0

Dưới đây là tương tự như "top" câu trả lời nhưng ngắn gọn hơn:

WHERE ((column2 = variableY) or COALESCE(column2, variableY) IS NULL)

+0

Hãy xem ngày trước khi đăng bài buddy..Cũng câu trả lời đã được chia sẻ. –

0
WHERE variableY is null or column2 = variableY 

for example: 
create table t_abc (
id number(19) not null, 
name varchar(20) 
); 

insert into t_abc(id, name) values (1, 'name'); 
insert into t_abc(id, name) values (2, null); 
commit; 

select * from t_abc where null is null or name = null; 
--get all records 

select * from t_abc where 'name' is null or name = 'name'; 
--get one record with name = 'name' 
+2

Vui lòng [sửa] câu trả lời và thêm giải thích về lý do tại sao tính năng này hoạt động. – Tushar

0

Bạn có thể sử dụng DUMP:

SELECT * 
FROM TABLEX 
WHERE DUMP(column2) = DUMP(variableY); 

DBFiddle Demo

Cảnh báo: Đây không phải là SARG-thể biểu hiện như vậy sẽ không có việc sử dụng chỉ mục.

Với cách tiếp cận này, bạn không cần tìm kiếm giá trị không tồn tại trong dữ liệu của mình (như NVL/COALESCE).