Chuỗi rỗng của Oracle chuyển thành null


7

Khi thực hiện thao tác chèn, một chuỗi rỗng được chuyển thành null:

insert into test (f) values ('');

Bây giờ, có một hàng với f chứa null.

Nhưng, khi tôi truy vấn bảng, tôi không thể sử dụng '':

select * from test where f='';
no rows selected

Tôi có thể sử dụng null:

select * from test where f is null;
____F_
NULL

Vì vậy, có vẻ như Oracle đã quyết định rằng các chuỗi rỗng không thể được sử dụng để chèn, nhưng chúng vẫn là các chuỗi trống khi thực hiện các truy vấn. Tài liệu về đâu khi một chuỗi rỗng trở thành null và khi nào nó vẫn là một chuỗi rỗng?



Câu trả lời:


8

Cái đó đã nói lên tất cả:

select NVL('','it is null') as value
from dual;

Câu đố SQL

2 điều:

1) ''được chuyển đổi thành NULLchèn. Đó là một VARCHAR2điều của Oracle .

2) select * from test where f='';đang cố gắng thực hiện select * from test where f=NULL, điều này không được xác định và sẽ không trả về gì vì NULLkhông giống như toán tử đẳng thức. Bạn phải sử dụng IS NULLhoặc IS NOT NULL.

Tôi sẽ thêm rằng CHARkiểu dữ liệu ứng xử khác nhau vì nó được đệm.


Oracle coi chuỗi rỗng '' là NULL.
Tarun Kumar

6

Oracle đối xử '' và NULL giống nhau. Khi chèn '', không có chuyển đổi '' thành NULL, chỉ đơn thuần là một cách giải thích '' NULLgiống như cách mà từ NULL được hiểu là NULLhoặc rtrim ('a', 'a') được hiểu là NULL.

Dưới đây là một minh họa bằng cách sử dụng bảng sau đây và chèn:

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');

Chèn ở trên đã chèn một giá trị NULL cho c1. Bạn có thể chọn hàng đó như sau:

SELECT c1 FROM t1;

Khi bạn thêm mệnh đề WHERE để so sánh đẳng thức và một trong các giá trị được so sánh là NULL, kết quả sẽ luôn là ẩn số. Unknown sẽ đánh giá thành false ngoại trừ các hoạt động tiếp theo trên một giá trị không xác định sẽ tạo ra các giá trị không xác định. Tất cả các trả về sau không có hàng vì các mệnh đề WHERE chứa các điều kiện sẽ không bao giờ đúng bất kể dữ liệu.

SELECT c1 FROM t1 WHERE c1 = '';
SELECT c1 FROM t1 WHERE c1 = NULL;
SELECT c1 FROM t1 WHERE '' = '';
SELECT c1 FROM t1 WHERE NULL = NULL;

Oracle cung cấp một cú pháp đặc biệt để truy xuất các hàng với một cột cụ thể có giá trị null - IS NULL.

SELECT c1 FROM t1 WHERE c1 IS NULL;

Có một vài điều kiện trong đó oracle so sánh NULLS đối xử với chúng bằng với các giá trị NULL khác, chẳng hạn như trong các câu lệnh DECODE và trong các khóa ghép.

Thông tin thêm có thể được tìm thấy trong Tài liệu tham khảo ngôn ngữ SQL .


Xin lỗi Leigh, đã viết câu trả lời cùng một lúc :)
Phil

@Phil tôi thích câu trả lời của bạn. Đó là trực tiếp và rõ ràng. Những gì tôi đang thấy không phải là vấn đề về '' và NULL. Đây là một vấn đề về = NULL và IS NULL.
kainaw

@Phil Không thành vấn đề. Tôi nghĩ rằng bạn đã giải quyết cốt lõi thực sự của sự nhầm lẫn.
Leigh Riffel

-1

Oracle RDBMS không tạo ra bất kỳ sự khác biệt nào giữa các chuỗi rỗng và rỗng; có nghĩa là không có chuyển đổi để chuyển đổi một chuỗi rỗng thành giá trị null.

Tôi có thể hiểu rằng không ai trong số 2 có chứa thông tin.


Điều đó không thể đúng. Nó phải được thực hiện một chuyển đổi. Nếu tôi chèn '' và không có chuyển đổi, tôi sẽ có thể chọn ''. Nhưng tôi không thể. Tôi phải chọn NULL để nhận '' Tôi đã chèn.
kainaw

1
Bạn không nhận được kết quả nào WHERE f= ''với cùng lý do bạn không nhận được kết quả nào WHERE f=NULL. Trong Oracle ''NULLgiống nhau nên cả hai đều đánh giá là sai.
Leigh Riffel

Oracle chuyển đổi các varchars có độ dài bằng không thành NULL. Nếu bạn sẽ tạo bảng của mình với f not nullràng buộc, phần chèn của bạn sẽ thất bại với lỗi "không thể chèn NULL".
Mindaugas Riauba

@LeighRiffel Câu trả lời của bạn dựa trên việc đọc kết quả không chính xác. Khi sử dụng '', bạn không nhận được kết quả. Khi sử dụng NULL, bạn nhận được kết quả với NULL trong đó. Có một sự khác biệt rất lớn giữa việc không có kết quả và nhận được một bản ghi với NULL trong đó. Hãy tưởng tượng nếu có hai cột. Sử dụng '', bạn không nhận được hồ sơ. Sử dụng NULL, bạn nhận được giá trị từ cột đầu tiên và giá trị NULL cho cột thứ hai - không phải là "không có bản ghi".
kainaw

@MindaugasRiauba Trong ví dụ trên, tôi đã chứng minh rằng Oracle chuyển đổi '' thành NULL trên các lệnh chèn. Nó không chuyển đổi '' thành NULL trên các lệnh được chọn. Vì vậy, tuyên bố "Oracle chuyển đổi '' thành NULL" không hoàn toàn chính xác.
kainaw

-3

Điều này giải thích một chút:

create table t1 (c1 char(1),
                 c2 char(3),
                 c3 varchar2(10));


insert into t1 values ('','','');
insert into t1 values ('a','a','a');

declare 
v1 char(1);
begin
v1 := '';
insert into t1 values (v1,v1,v1);
end;

select * from t1;

select count(c1) from t1;
select count(c2) from t1;
select count(c3) from t1;

select length(c1), length(c2), length(c3) from t1;

Xin chào, chào mừng đến với trang web. Bạn có thể giải thích cách mã của bạn hoạt động và cách nó giải thích câu hỏi của OP không?
Tom V - thử topanswers.xyz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.