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
以来的天数.
我收到了其他人的查询,并试图将其分解以了解所有内容。
在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
以来的天数.