ORACLE 不支持不等於空字符串

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

-- FALSE
SELECT 1 FROM DUAL WHERE '' IS NULL; 
-- TRUE
SELECT 1 FROM DUAL WHERE '' IS NOT NULL; 
-- 注意: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 且該字段絕對不可能出現的任意值
SELECT 1 FROM 表名 WHERE 字段名A <> ' ';
-- 注意:
--   正常可以寫隨便不等於某個值,但由於 DB2 對字段數據長度的嚴格要求,
--   假設字段長度爲 1 ,這時對比的查詢條件長度爲 2 (如:ab),這時查詢就會報錯
-- 假設“字段名B”長度爲 1 ,則以下 SQL 在應用中進行查詢會報錯
SELECT 1 FROM 表名 WHERE 字段名B <> 'ab';
-- 而這樣就不會報錯了
SELECT 1 FROM 表名 WHERE 字段名B <> 'a';

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章