ISNULL печатает * - PullRequest
       18

ISNULL печатает *

0 голосов
/ 06 июня 2018

Я сталкиваюсь с этим странным поведением (возможно, не странным, но за пределами моего понимания) при использовании isnull.Все это сводится к следующему:

isnull(left(cast(null as varchar),1),0) дает 0

isnull(left(cast(null as varchar),1),-1) дает *

Я хотел бы знать причину такого поведения.

Хотя я нашел обходной путь:

select isnull(cast(left(cast(null as varchar),1) as varchar),-1)

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Причиной звездочки является ошибка переполнения.left(cast(null as varchar),1) вернет varchar(1).В пределах ISNULL значение -1 будет неявно преобразовано в varchar(1), и отрицательное число не может быть представлено одним символом, поэтому отображается '*'.

Если вы изменитеLEFT(...2), затем получите результат:

SELECT ISNULL(LEFT(CAST(NULL AS varchar),2),-1);

На другой ноте Плохие привычки бросать: объявлять VARCHAR без (длина)

0 голосов
/ 06 июня 2018

Вы можете использовать COALESCE:

SELECT COALESCE(left(cast(null as varchar),1),-1);

DBFiddle Demo

ISNULL выводит тип данных из первого аргумента, COALESCE выводит из более широкого ( приоритет типа данных )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...