2014-06-06 168 views
1

我試圖編寫一個簡單地選擇所有非空名稱的查詢。下面兩個查詢返回結果:在oracle中選擇不等於空字符串的字段

SELECT name FROM MyTable WHERE name != ''; 

SELECT name FROM MyTable WHERE name = ''; 

對於背景下,這兩個查詢返回結果的:

SELECT name FROM MyTable WHERE name != 'a'; 

SELECT name FROM MyTable WHERE name IS NOT NULL; 

我讀的地方,空字符串等同於甲骨文NULL,但我還是不明白爲什麼這解釋了這種行爲。我需要同時支持SQL Server和Oracle,這就是爲什麼我不能只依靠WHERE name IS NOT NULL

任何人都可以解釋這裏發生了什麼?謝謝!

+0

嗨,朋友,這取決於你的專欄的類型。 Oracle在varchar2 vs char列上的行爲有點意外。這另一個問題有詳細信息:http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings?rq=1 –

+0

我不知道你的應用程序和支持,以及你這樣做,但這可能是和ORM的任務?看看它是否有幫助會很有趣。 – johnny

+0

[爲什麼Oracle 9i將空字符串視爲NULL?](http://stackoverflow.com/questions/203493/why-does-oracle-9i-treat- an-empty-string-as-null) – johnny

回答

4

,涉及任何比較NULL值將始終返回FALSE。

+0

我認爲這是解釋它,謝謝。我還發現:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm其中說「由於null表示缺少數據,null不能等於或不等於任何值,或者到另一個空值「這解釋了爲什麼名稱既不相等也不等於空。 – JYX

4

任何人都可以解釋這裏發生了什麼?謝謝!

Ask Tom存檔。

ZERO length varchar被視爲NULL。

''不被視爲NULL。當分配給char(1)變成''(char類型是空白填充的字符串)時'

''。

「」當分配給一個VARCHAR2(1)變爲「」,這是一個零長度的字符串和一個零 長度字符串是Oracle NULL(它不再「」)

+2

看完這個後我更加困惑。 – mason

+0

@mason基本上,當你將一個零長度的字符串插入一個Varchar2列時,它在Oracle中變爲NULL。這違背了ANSI標準的內容,但Oracle一直在做自己的事情。 – Mike

+0

那麼'''是一個零長度的字符串? – mason