簡體   English   中英

比較Oracle SQL中的兩個空字符串

[英]Comparing two empty Strings in Oracle SQL

嗨,今天我遇到了奇怪的情況。 我有一個where子句,where條件是返回String的條件,我想檢查它是否為空。 而且,當返回空字符串時,Oracle仍然將其視為不同的字符串。 因此,我走了一步,准備了簡單的查詢:

select 1 from dual where 1 = 1;
returns: 1

select 1 from dual where 'A' = 'A';
returns: 1

現在我不明白的是:

select 1 from dual where '' = '';
No result.

即使我檢查它們是否不同,仍然沒有結果。

select 1 from dual where '' != '';
No result.

有人可以幫我解釋一下嗎?

Oracle將空字符串視為NULL。 這是一個陷阱。 記下它,並希望它永遠不會在生產中對您造成傷害。

原因是正如@Captain Kenpachi所解釋的。 如果要比較兩個字符串(或其他相同的類型),並且要容忍NULL(或Oracle中的空字符串,因為它會將其視為相同),則需要進行IS測試。

您可以嘗試使用永遠不會使用的流氓值來作弊,但墨菲定律規定某人會一天。 該技術還具有一個缺點,即流氓值應與要比較的事物的類型匹配,即比較需要流氓字符串的字符串,而比較需要流氓日期的日期。 這也意味着您不能不加思索地隨意剪切和粘貼它。 示例: WHERE NVL(col1,'MyRougeValue')=NVL(col2,'MyRougeValue')

標准版本將在其中顯式測試NULL WHERE (col1=col2 OR (col1 IS NULL AND col2 IS NULL))

相反的變為WHERE NOT(col1=col2 OR (col1 IS NULL AND col2 IS NULL))

我已經看到了一個相反的版本(在Toad的數據比較工具中可以看到) WHERE (col1<>col2 OR (col1 IS NULL AND col2 IS NOT NULL) OR (col1 IS NOT NULL AND col2 IS NULL))

Oracle確實具有方便的DECODE函數,該函數基本上是在IF a IS b THEN c ELSE d因此相等性是WHERE DECODE(col1,col2,1,0)=1 ,而相反是WHERE DECODE(col1,col2,1,0)=0 您可能會發現這比顯式IS測試要慢一些。 它是Oracle專有的,但有助於彌補空字符串問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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