SQL 服务器 - 在 CONVERT() 之前和其中使用 ISNULL() 有什么区别?

SQL Server - what's the difference between using ISNULL() in front of CONVERT() and within it?

我收到了其他人的查询,并试图将其分解以了解所有内容。

在SELECT中,大多数列的调用如下:

CONVERT(VARCHAR,ISNULL(<column name>,''),100)

如果像这样使用 ISNULL 函数会有很大的不同吗:

ISNULL(CONVERT(VARCHAR,<column name>,100),'')

一开始找我没什么大不了的,但也许有经验的人会知道。

其实还是有区别的。

当你将 '' 转换为 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

Returns(colA2 和 ColB2 是空 varchars):

colA1   colA2               colB1               colB2
0                           Jan 1 1900 12:00AM  

注:以上均为测试

运行 ISNULL(<variable>, '') 将 return 最小值,具体取决于数据类型。

DECLARE 
    @intVar     INT,
    @dateVar    DATE,
    @varcharVar VARCHAR(20)

SELECT 
    [INT]       = ISNULL(@intVar, ''), 
    [DATE]      = ISNULL(@dateVar, ''), 
    [VARCHAR]   = ISNULL(@varcharVar, '')

运行 上面的脚本将 return:

INT         DATE       VARCHAR
----------- ---------- ----------
0           1900-01-01 

如果在 CONVERT 之前先执行 ISNULL,将不会产生预期的结果:

INT        DATE        VARCHAR
---------- ----------- ----------
0          Jan  1 1900 

另一方面,如果你在CONVERT之后执行ISNULL,它会产生预期的结果,即''

INT        DATE       VARCHAR
---------- ---------- ----------
                                -- These are empty strings('')

正如 Aaron Bertrand 在 comment 中所述,空字符串 '' 的计算结果为 0,它隐含地是一个整数,表示自 1900-01-01 以来的天数.