[英]Oracle:Difference between NULL and EMPTY string
由於Oracle行為,我的查詢未返回任何值。
問題是這樣的: 甲骨文插入數據時,但不選擇回數據時,考慮空字符串為NULL 。
這不是Oracle 9i為什么將空字符串視為NULL的重復項? 因為在這里我不是要問這個問題的原因,我很清楚原因,我是在尋求解決這個問題的方法。
這是我的表結構
CREATE TABLE TEST
(
ID NUMBER not null,
NAME VARCHAR2(255)
)
插入值時,oracle將接受
插入測試值(1,'');
我發現內部oracle將零長度的字符串轉換為NULL並存儲
但是我的查詢
SELECT * FROM TEST WHERE NAME = INPUT;(INPUT ='')
(輸入是從前端傳遞的,有時會有空字符串)
不會返回任何結果
由於性能問題,我無法編寫動態查詢
之前曾遇到此問題的人請讓我知道如何比較EMPTY STRING和NULL
問題在於,Oracle(默認情況下)將空字符串視為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>')
這是Oracle最令人討厭的功能之一-在其他數據庫產品中找不到。 對於Oracle的所有其他其他優點,您將不得不忍受它-並且要准備好學習曲線不是很快。
要檢查null是否相等,最好的方法是顯式地編寫您在做什么,而不是使用using頭。 例如:
... where NAME = INPUT or (NAME IS NULL and INPUT IS NULL)
這將使您自己以及以后的其他人現在(尤其是以后)調試,維護和修改代碼變得容易得多。 也有其他解決方案,但是將來它們可能會使其他人感到困惑。 例如,這是我不會使用的(出於幾個原因):
... where NAME || 'z' = INPUT || 'z'
盡管顯然用更少的鍵入即可達到相同的結果。
還有一件事,在大多數情況下,您不應該在將NULL視為“等於”的結果行中包括-值是NULL是有原因的,並且在大多數情況下,如果使兩個NULL相等,則這不是預期的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.