2016-09-17 3 views
2

Недавно я столкнулся со сценарием, когда функция ISNULL возвращает мне усеченные данные, если первая строка равна NULL.Проблема усечения с помощью функции ISNULL в SQL Server

ISNULL(a, b); 

Я нашел а есть 5 символов и Ь 10 символов, но когда есть нуль будет возвращать только 5 символов Ь, а не всю длину.

Это известная проблема?

+0

Проверьте, есть ли какая-либо переменная Объявлено только с размером 5 ... –

ответ

8

Известно поведение

От MSDN

Значение check_expression возвращается, если это не NULL; в противном случае replace_value возвращается после того, как он неявно преобразован в тип check_expression, если типы разные. replace_value может быть усечено, если значение replace_value больше, чем check_expression.

Использование 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

Также вы можете использовать случай, когда с дополнитель на ответ @Prdp.

CASE WHEN a is null then b else a end AS caseWhen_Result 
Смежные вопросы