ORACLE及MSSQL針對空字串('')、空白字串('
')處理上兩者截然不同。以下將建立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。
|
沒有留言:
張貼留言