之前的應用一直是連接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';