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,

Другие вопросы по тегам