ORACLE 不支持不等於空字符串( '')


之前的應用一直是連接DB2數據庫,DB2對空和空字符串的識別是不相等的,如:

  1.  
    -- FALSE
  2.  
    SELECT 1 FROM DUAL WHERE '' IS NULL;
  3.  
    -- TRUE
  4.  
    SELECT 1 FROM DUAL WHERE '' IS NOT NULL;
  5.  
    -- 注意:NULL 不能用 =、!=、<> 進行比較,只能用 IS、IS NOT 進行比較

是沒返回記錄的,所以在寫過濾空字段時要將空和空字符串都過濾掉,一般是這樣寫

SELECT 1 FROM 表名 WHERE 字段名A IS NOT NULL AND 字段名A <> '';

后面發現,其實一般在寫“字段名A <> '某個值'”時,數據庫就已經自動把空的數據過濾掉了,如:

SELECT 1 FROM 表名 WHERE 字段名A <> '';

就可以,所以后面過濾空字段時都這樣寫了。

最近,有個點用的數據庫是 ORACLE,而 ORACLE 對空和空字符串的識別是等同的,即 '' 等同於 NULL,這樣以前寫的

SELECT 1 FROM 表名 WHERE 字段名A <> '';

就相當於

SELECT 1 FROM 表名 WHERE 字段名A <> NULL;

而ORACLE 的 NULL 只能用 IS 或 IS NOT 進行比較,而不能用 = 、!= 、<> 進行比較,用 = 、!= 、<> 比較的結果都是返回 FALSE 的,所以導致數據一直查詢不出來。

 

總結:

為了兼容 DB2 和 ORACLE,最后將SQL改成

  1.  
    -- 將不等於空字符串修改為不等於一個空格,也可以某個長度為 1 且該字段絕對不可能出現的任意值
  2.  
    SELECT 1 FROM 表名 WHERE 字段名A <> ' ';
  3.  
    -- 注意:
  4.  
    -- 正常可以寫隨便不等於某個值,但由於 DB2 對字段數據長度的嚴格要求,
  5.  
    -- 假設字段長度為 1 ,這時對比的查詢條件長度為 2 (如:ab),這時查詢就會報錯
  6.  
    -- 假設“字段名B”長度為 1 ,則以下 SQL 在應用中進行查詢會報錯
  7.  
    SELECT 1 FROM 表名 WHERE 字段名B <> 'ab';
  8.  
    -- 而這樣就不會報錯了
  9.  
    SELECT 1 FROM 表名 WHERE 字段名B <> 'a';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM