2016-11-22 81 views
0

我在ORACLE鍵入下面的SQL,它通過:爲什麼SQL'選擇1從雙方0 = null;'通過在Oracle

select 1 from dual where 0=null; 

爲什麼SQL傳遞,它似乎沒有編譯錯誤奇怪。而且,如果null是表中的varchar2列,它也會通過。

create table test 
(
    a varchar2(100), 
    b varchar2(100) 
) 

insert into test(a,b) VALUES (null, 'abc'); 
commit; 

select * from test where a=0 

更新:

由於列「一」是VARCHAR2類型,0是一個數字類型,如果一個不包含空值,它會報告錯誤。

create table test 
(
    a varchar2(100), 
    b varchar2(100) 
) 

insert into test(a,b) VALUES ('abc', 'abc'); 
commit; 


select * from test where a=0 

--ORA-01722 "invalid number" 

謝謝。

+0

你有什麼關於查詢的期望? –

+1

你是什麼意思「通行證」? '0 = null'沒有任何*語法錯誤。它從來沒有評估爲真。 –

+1

你的問題到底是什麼?這裏意外的是什麼? – Bohemian

回答

4

它通過,因爲syntax是正確的。它包含所有必需的元素,因此可以進行分析。然後它被執行。請參閱語句如何processed
它不會返回任何結果,因爲條件不成立。

2

這是因爲NULL是一個值,就像任何其他值一樣。如果沒有使用is,(in)相等檢查將失敗,但語法仍然有效。

而不是直接寫入NULL讓我們假設你正在傳遞一個變量:1和重新編寫查詢這樣的:

select 1 from dual where 0 = :1 

在這種情況下,:1值可以是任何東西,決心這是由調用代碼和你寫的SELECT語句不知道調用代碼會傳入什麼值。

因此,Oracle不可能說這個語句是無效的,即使它可以完全按照您所寫的表示:

select 1 from dual where 0 = null 

,因爲這也可能是:

select 1 from dual where 0 = 0