2016-09-17 59 views
2

最近我遇到了ISNULL函數在第一個字符串爲空的情況下返回截斷數據的場景。SQL Server中ISNULL函數的截斷問題

ISNULL(a, b); 

我找到了一個是5個字符,b爲10個字符,但是當一個爲空,將返回只有5個字符B和不充分的長度。

這是一個已知的問題?

+0

檢查是否有任何變量聲明大小隻有5 ... –

回答

8

這是一個衆所周知的行爲

MSDN

如果不是,則返回NULL check_expression的價值; 否則,在隱式地將 轉換爲check_expression類型後,如果類型不同,則返回replacement_value。 如果replacement_value長於 check_expression,則可以截斷replacement_value。

使用COALESCE過度來到這個問題

SELECT COALESCE(a, b) From yourtable 

這裏是一個演示

CREATE TABLE #nulltest 
    ( 
    a CHAR(5), 
    b CHAR(10) 
) 

INSERT INTO #nulltest 
VALUES  ('12345','1234567890'), 
      (NULL,'1234567890') 

SELECT a, 
     b, 
     ISNULL(a, b) AS Isnull_Result, 
     COALESCE(a, b) AS Coalesce_Result 
FROM #nulltest 

結果:

╔═══════╦════════════╦═══════════════╦═════════════════╗ 
║ a ║  b  ║ Isnull_Result ║ Coalesce_Result ║ 
╠═══════╬════════════╬═══════════════╬═════════════════╣ 
║ 12345 ║ 1234567890 ║   12345 ║  12345  ║ 
║ NULL ║ 1234567890 ║   12345 ║  1234567890 ║ 
╚═══════╩════════════╩═══════════════╩═════════════════╝ 
0

您也可以使用情況,即隨着additi對@Prdp答案。

CASE WHEN a is null then b else a end AS caseWhen_Result