簡體   English   中英

Oracle:NULL與EMPTY字符串之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM