2016-09-17 18 views
2

最近、最初の文字列がnullの場合、ISNULL関数が切り捨てられたデータを返すというシナリオに直面しました。SQL ServerのISNULL関数での切り捨ての問題

ISNULL(a, b); 

私はaが5つの文字であり、bは10文字ですが、nullであるとき、それはB、完全ではない長さのわずか5文字を返します発見しました。

これは既知の問題ですか?

+0

任意の変数があるかどうかを確認します。サイズが5の場合のみ宣言します。 –

答えて

8

それは既知の動作check_expressionの値は、それがNULLでない場合に返されるMSDN

から

です。 それ以外の場合は、暗黙的に が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でCASEを使用することができます@Prdp答えに。

CASE WHEN a is null then b else a end AS caseWhen_Result 
関連する問題