2016-04-22 13 views
0

我處於由於oracle行爲而導致查詢未返回任何值的情況。
Oracle:NULL和EMPTY字符串之間的區別

問題是這樣的:Oracle considers EMPTY STRING as NULL when INSERTING DATA but not when SELECTING BACK the data

這不是Why does Oracle 9i treat an empty string as NULL?的重複,因爲在這裏我不是要問這個問題的原因,我很清楚原因,我要求解決這個問題。

這是我的表結構

CREATE TABLE TEST 
    (
     ID   NUMBER not null, 
     NAME VARCHAR2(255) 
    ) 

插入值oracle會接受

INSERT INTO TEST值(1, '')時;

我發現內部甲骨文轉換字符串長度爲零,爲NULL並存儲

但我查詢

SELECT * FROM TEST WHERE NAME =輸入;(INPUT = '')

(輸入從前端過去了,有時有空字符串)
不會返回任何結果
我不能寫動態由於性能問題

有人誰遇到這個問題之前,請讓我知道如何比較用NULL

+0

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

+1

@vkp我不是要求原因。我要求解決這個問題。所以這不是重複的。在問這個問題之前,我已經通過了這個問題。 – shreesha

+0

只是爲了反駁OP的反對意見:我不明白他/她的問題怎麼可能是「爲什麼...」的重複(儘管我毫不懷疑它是某件事的重複;其他人一定會問這個問題之前,也許它只是不顯示在一個快速搜索。) – mathguy

回答

0

這是甲骨文最討厭的特徵之一 - 其他數據庫產品未找到。對於甲骨文的其他所有優勢,您將不得不忍受,並且要準備好學習曲線不是很快。

要檢查空值是否相等,最好的方法是明確地寫下你在做什麼,而不是使用噱頭。例如:

... where NAME = INPUT or (NAME IS NULL and INPUT IS NULL) 

這將使人們更方便自己,和別人追你,調試,維護和修改代碼,現在,尤其是更高版本。還有其他解決方案,但他們未來可能會混淆他人;例如,這是我不會使用的東西(出於以下幾個原因):

... where NAME || 'z' = INPUT || 'z' 

雖然很明顯用較少的鍵入會達到相同的結果。

還有一件事,在大多數情況下,您不應該在結果行中包含NULL,因爲它們將NULL視爲「相等」 - 由於某種原因,值爲NULL,並且在大多數情況下,如果使兩個NULL值相等,預期的結果。

+0

你也使用'WHERE LNNVL(NAME <> INPUT)' –

+0

真的......但是......這正是我不喜歡的那些噱頭之一。在一個小型組織中,我可能會有一位C#開發人員查看我的代碼,我當然希望他能立即明白我寫這篇文章的「我的方式」。他們肯定會不得不穀歌LNNVL,考慮爲什麼我使用<>當我檢查平等,... – mathguy

3

問題空字符串查詢的是,甲骨文(默認)將空字符串視爲NULL。因此:

where name = '' 

是一樣的:

where name = NULL 

兩者總是失敗(因爲它們返回NULL)。

您可以通過多種方式解決此問題。一種方法是:

where (name = INPUT or name is null and INPUT is null) 

或者,如果你知道有一個無效的名字:

where coalesce(name, '<invalid>') = coalesce(INPUT, '<invalid>') 
+1

Oracle將空字符串視爲NULL - 除非不存在。比較,例如,translate('abc','a','')與regexp_replace('abc','a','')。 – mathguy

+0

@mathguy。 。 。或者,Oracle接受'NULL'字符串值,你可能不希望他們。 –

相關問題