2013年10月8日 星期二

空白字串處理原則/差異

ORACLEMSSQL針對空字串('')、空白字串(' ')處理上兩者截然不同。以下將建立4筆測試資料並進行3項測試,可得以下結論:
MSSQL:自動將空白字元Trim掉後比較,不論含有多少空白元之空白字串均視為空字串(如#1#2結果)。
ORACLE:視空字串NULL(如#3結果)。

MSSQL
ORACLE
說明
SQL
SELECT "T.Case"
, '>' + VAL + '<' VAL
, LEN(VAL) "Len"
FROM
  (
SELECT '0個空白' "T.Case"
        , '' VAL
UNION ALL
SELECT '1個空白' , ' '
UNION ALL
SELECT '2個空白' , '  '
UNION ALL
SELECT 'NULL', NULL
) A
WHERE 1=1
  --AND VAL = ''   --#1
  AND VAL = ' '    --#2
  AND VAL IS NULL --#3
SELECT "T.Case"
, '>' || VAL || '<' VAL
, LENGTH(VAL) "Len"
FROM
  (
SELECT '0個空白' "T.Case"
        , '' VAL
FROM DUAL
UNION ALL
SELECT '1個空白' , ' '
FROM DUAL
UNION ALL
SELECT '2個空白' , '  '
FROM DUAL
UNION ALL
SELECT 'NULL', NULL
FROM DUAL
) A
WHERE 1=1
--AND VAL = ''    --#1
  -- AND VAL = ' '  --#2
AND VAL IS NULL   --#3

#1
VAL = ''

(無資料)
S:查詢將列出3筆,空白字元視均視為相同。
O:無資料。0個空白字元(空字元)被視為NULL#3)。
#2
VAL = ' '


S:查詢將列出3筆,空白字元視均視為相同(同#1)。
O:符合查詢條件,即1個空白字元。

#3
VAL IS NULL


S:符合查詢條件,即NULL值。
O:查詢出空字元NULL值兩筆。

ORACLE查詢時,除空字串將視為NULL值外,其他長度大於1之空白字串,則可明確查詢出N個空白字元之字串;上述案例中,MSSQL中則無法區分任何長度之空白字元均視為相同,需配合DATALENGTH函數使用才可確知,一般所用LEN字串長度函數是取得字元數,會自動將右側空白字元捨去,而無法判斷實際之空白字串長度,但DATALENGTH函數是取得位元數,不會進行剔除空白字元,使用方法及結果如下:


SQL
結果
說明
SELECT "T.Case"
, '>' + VAL + '<' VAL
, LEN(VAL) "Len"
FROM
  (
SELECT '0個空白' "T.Case" 
       , '' VAL
UNION ALL
SELECT '1個空白' , ' '
UNION ALL
SELECT '2個空白' , '  '
UNION ALL
SELECT 'NULL', NULL
) A
WHERE 1=1
  AND VAL = ''
  AND DATALENGTH(VAL) = 2

使用DATALENGTH函數,判斷長度為2者。

LEN函數取得長度仍然為0

沒有留言:

張貼留言