isnull函数中的T-SQL意外行为

时间:2016-12-01 08:21:02

标签: sql-server tsql

当我运行此查询时,我希望结果为' false'

IF isnull(0,'') = '' 
      select 'true' 

else 
     select 'false'

但是sql Server告诉我' true'为什么?

3 个答案:

答案 0 :(得分:2)

在这种情况下,print(a.resample('5ms').first().interpolate()) Value Time 2016-01-23 00:00:00.000 1.0 2016-01-23 00:00:00.005 1.5 2016-01-23 00:00:00.010 2.0 2016-01-23 00:00:00.015 3.0 2016-01-23 00:00:00.020 4.0 返回一个整数。 SQL Server也会将第二个参数转换为整数,即0.因此0 = 0,因此结果为TRUE。直接与0比较也将返回true:

ISNULL(0,'')

像这样使用ISNULL和NULL是不寻常的。 IF 0 = '' select 'true' else select 'false' 子句中的ISNULL(someColumn='')函数会阻止优化器使用涵盖WHERE的任何索引,从而强制扫描而不是索引搜索。

在SELECT中使用IF语句是不可能的。即使在CASE语句中,最好显式检查NULL而不是应用这样的转换。

答案 1 :(得分:2)

对于您的情况,比较两个值时,''将首先转换为int。以下内容:

SELECT CONVERT(INT, '')

返回0,因此0=0为真

如果您希望将0视为NULL,则可以使用NULLIF

DECLARE @i INT = 0
IF NULLIF(ISNULL(@i, ''), 0) = ''
     SELECT 'true'
ELSE
     SELECT 'false'

这将返回'false'

答案 2 :(得分:0)

当只有两个值(即NULL和0)时,

ISNULL是相同的,因此,在IF条件下它将为真,并且将打印选择“true”。