Sql server SQL Server ISNULL函数将空字符串计算为零(0)

Sql server SQL Server ISNULL函数将空字符串计算为零(0),sql-server,Sql Server,有人能解释一下为什么下面的查询将计算结果设为“null”,即使@Test=null的值被赋值,并且在CASE中它被检查为0 declare @Test varchar = NULL SELECT (CASE ISNULL(@Test, '') WHEN 0 THEN 'null' ELSE 'not null' END) as 'value' 这将返回“null” 及 这也会返回“null” 因此,将ISNULL(NULL

有人能解释一下为什么下面的查询将计算结果设为“null”,即使@Test=null的值被赋值,并且在CASE中它被检查为0

declare @Test varchar = NULL
    SELECT (CASE ISNULL(@Test, '')
            WHEN 0 THEN 'null'
            ELSE 'not null'
        END) as 'value'
这将返回“null”

这也会返回“null”


因此,将ISNULL(NULL、“”)计算为“”或0并没有任何区别?

下面是更好的尝试方法

CASE WHEN  @Test IS NULL THEN 0  -- Type numeric
     ELSE '-'                 -- Type VARCHAR
     END AS outputvlaue
CASE WHEN  @Test IS NULL THEN 0  -- Type numeric
     ELSE 123                 -- Type numeric
     END AS outputvlaue
这会给你错误,因为你不能有两个返回类型的情况下,所以 尝试如下

CASE WHEN  @Test IS NULL THEN 0  -- Type numeric
     ELSE '-'                 -- Type VARCHAR
     END AS outputvlaue
CASE WHEN  @Test IS NULL THEN 0  -- Type numeric
     ELSE 123                 -- Type numeric
     END AS outputvlaue
以上方法将起作用


查询的输出是正确的
ISNULL(@Test',)
表示存在null时返回“”值

这两个查询都有效,因为当您这样尝试时,case..when语句

  SELECT (CASE ISNULL(@Test, '')
            WHEN 0 THEN 'null'
            ELSE 'not null'
        END) as 'value'
  SELECT CASE WHEN ISNULL(NULL,'') = '' 
     THEN 'a' 
     ELSE 'b' 
  END
Isnull返回您的真值,就像您在case station计算为true时给出的表达式一样,它是Isnull(@Test“”)及其true

所以你必须这样尝试

  SELECT (CASE ISNULL(@Test, '')
            WHEN 0 THEN 'null'
            ELSE 'not null'
        END) as 'value'
  SELECT CASE WHEN ISNULL(NULL,'') = '' 
     THEN 'a' 
     ELSE 'b' 
  END

将返回“a”

在与0进行比较之前,您正在将@Test隐式转换为INT-这相当于转换时的
(@Test AS INT)=0
。要将
'
0
进行比较,服务器必须首先将其转换为INT,即转换为0。你想用这些代码做什么?为什么不使用适当的
IS NULL
,即@Test为NULL时的
情况,然后。。。其他的结束
?@PanagiotisKanavos感谢您的解释事实上我在一个项目中通过了一些旧的moules,我发现这个代码与问题的第一个条件类似。我想,为什么在计算“”时不将条件计算为false0@RajanPatel我希望这是你在模块中能找到的最小的蛇。不幸的是,这种蛇的第二个查询的companyput似乎是正确的。但是为什么它不返回“not null”,因为ISNULL(null,'')将返回“”,我们正在对照0检查它。@RajanPatel您的代码要求在检查之前将
'
转换为0。为什么不使用
IS NULL
?为什么要转换为
''
然后转换为int?@RajanPatel-因为在第一种情况下,它与数值vlaue进行比较,这就是它工作的原因..您可以尝试第一种情况,例如当0时为null(@Test,1),然后为null,否则为notnull