2014-10-09 23 views
5

tôi có bảng này, nơi NULL là giá trị NULL, không phải là chuỗi NULL:Oracle NVL với chuỗi rỗng

MYCOL 
-------- 
NULL 
example 

Tại sao truy vấn này không trả lại hàng NULL?

select * from example_so where nvl(mycol, '') = ''; 

Trả lời

10

'' là một lần nữa NULL trong Oracle, bởi vì Oracle không hỗ trợ Strings trống giống như ngôn ngữ cấp cao khác hoặc DBMS ..

Bạn cần phải tìm kiếm NULL/chuỗi rỗng sử dụng IS NULL hoặc IS NOT NULL

Không có nhà điều hành quan hệ nào khác làm việc với NULL, mặc dù nó có giá trị về mặt cú pháp. SQLFiddle Demo

Nó phải được,

select * from example_so where mycol IS NULL 

EDIT: Theo Docs

Oracle Database hiện đối xử với một giá trị nhân vật với chiều dài của zero như null. Tuy nhiên, điều này có thể không tiếp tục đúng trong các bản phát hành trong tương lai và Oracle khuyên bạn không nên xử lý các chuỗi trống giống như các giá trị rỗng.

+0

Tại sao ' ''' là 'NULL'? Không phải là '' '' chuỗi rỗng? – kmkaplan

+0

Bởi vì một chuỗi rỗng là NULL trong Oracle. Xem demo của tôi trong câu trả lời. –

+0

@kmkaplan câu trả lời được cập nhật với lời giải thích –

6

NULL = NULL đơn giản là không xác định. Một nhà nước thứ ba có lẽ? Nó không phải là TRUE cũng không phải FALSE.

Oracle coi EMPTY STRING là NULL.

nvl(mycol, '') không có ý nghĩa thực sự, vì bạn đang tạo NULL trở lại NULL và so sánh lại với NULL.

SQL> WITH DATA AS(
    2 SELECT 1 val, 'NULL' str FROM dual UNION ALL 
    3 SELECT 2, NULL str FROM dual UNION ALL 
    4 SELECT 3, '' str FROM dual UNION ALL 
    5 SELECT 4, 'some value' str FROM dual) 
    6 SELECT val, NVL(str, 'THIS IS NULL') FROM data WHERE str IS NULL 
    7/

     VAL NVL(STR,'THI 
---------- ------------ 
     2 THIS IS NULL 
     3 THIS IS NULL 

SQL> 
0

chọn * từ example_so trong đó nvl (mycol, '') = '';

NVL (mycol, '') sẽ được kết quả như NULL và khi bạn so NULL với chuỗi rỗng nó không thể được so sánh

create table t(id varchar2(2)); 
insert into t values (nvl(null,'')); <------ this will insert NULL 
insert into t values (nvl(null,'et')); 
Các vấn đề liên quan