SQL Server - в чем разница между использованием ISNULL() перед CONVERT() и внутри него?
У меня есть чей-то запрос для работы, и я пытаюсь разбить его, чтобы все понять.
В SELECT большинство столбцов вызываются так:
CONVERT(VARCHAR,ISNULL(<column name>,''),100)
Имеет ли это большое значение, если функция ISNULL использовалась следующим образом:
ISNULL(CONVERT(VARCHAR,<column name>,100),'')
На первый взгляд, это не имеет большого значения, но, возможно, кто-то с большим опытом узнает.
2 ответа
На самом деле есть разница.
Когда вы разыгрываете '' как int, вы получаете 0, разыгрываете его на varchar и получаете '0'.
Когда вы разыгрываете null как varchar, вы получаете null. Isnull изменит значение на ''
DECLARE @a int = null, @b datetime = null
SELECT
CONVERT(VARCHAR,ISNULL(@a,''),100) colA1,
ISNULL(CONVERT(VARCHAR,@a,100),'') colA2,
CONVERT(VARCHAR,ISNULL(@b,''),100) colB1,
ISNULL(CONVERT(VARCHAR,@b,100),'') colB2
Возвращает (colA2 и ColB2 - пустые варианты):
colA1 colA2 colB1 colB2
0 Jan 1 1900 12:00AM
Примечание: все это основано на тестировании
Бег ISNULL(<variable>, '')
вернет минимальное значение в зависимости от типа данных.
DECLARE
@intVar INT,
@dateVar DATE,
@varcharVar VARCHAR(20)
SELECT
[INT] = ISNULL(@intVar, ''),
[DATE] = ISNULL(@dateVar, ''),
[VARCHAR] = ISNULL(@varcharVar, '')
Запуск вышеуказанного скрипта вернет:
INT DATE VARCHAR
----------- ---------- ----------
0 1900-01-01
Если вы выполняете ISNULL
сначала до CONVERT
не даст ожидаемого результата:
INT DATE VARCHAR
---------- ----------- ----------
0 Jan 1 1900
С другой стороны, если вы выполняете ISNULL
после CONVERT
, будет продукт ожидаемый результат, то есть ''
INT DATE VARCHAR
---------- ---------- ----------
-- These are empty strings('')
Как указано в этом комментарии Аарона Бертрана, пустая строка ''
оценивает 0
, который неявно является целым числом, представляющим количество дней с 1900-01-01
,