为什么我不能在SQL Server中选择column_name IS NULL?

时间:2015-10-13 09:48:34

标签: sql sql-server null

create table MyTable (id int not null primary key, val int);

insert into MyTable (id, val) values (1, 1), (2, null);

select id, val, val is null as val_null from MyTable;

当然这是有效的SQL。然而,SQL服务器抱怨#34的语法无效,为空"。为什么会这样?

SQL小提琴:http://sqlfiddle.com/#!6/73f9a/1(我尝试过这个用于SQL Server 2008和2014年,但是对于2014年,我不断收到#34;糟糕"消息,提示SQL Fiddle有些问题,可能暂时的。)

3 个答案:

答案 0 :(得分:2)

您只能在条件中编写is null,mssql不支持从条件转换为布尔值。因此,您需要IIF语句才能获得结果:

select id, val, IIF(val is null, 1, 0) as val_null 
from MyTable;

IIF适用于SQL Server 2012+版本。

答案 1 :(得分:2)

您可以使用NULLISNULL更改COALESCE值:

LiveDemo

select id, val, ISNULL(val, 0) as val_null
from MyTable;

或:

select id, val, COALESCE(val, 0) as val_null
from MyTable;

select id, val, CASE 
                 WHEN val IS NULL THEN 0
                 ELSE val
               END as val_null
from MyTable;

<强>解释

您无法直接在IS NULL中使用SELECT predicate

  

是一个计算结果为TRUE,FALSE或UNKNOWN的表达式。谓词   用于WHERE子句和HAVING子句的搜索条件,   FROM子句的连接条件,以及其他构造   布尔值是必需的。

使用ISNULL / COALESCE功能代替。或者使用CASE包装谓词。

答案 2 :(得分:1)

你不能简单SELECT val IS NULL的原因是因为从这种类型的表达式(谓词)到值没有隐式强制。就此而言,它与SELECT val > 10没有区别。您可以看到documentation,它明确地显示在哪里:

  

(谓词,包括IS [NOT] NULL ...)是一个计算结果为TRUE,FALSE或UNKNOWN的表达式。谓词用于WHERE子句和HAVING子句的搜索条件,FROM子句的连接条件以及需要布尔值的其他构造。

当您想要使用谓词来选择值时,您应该明确它,例如,使用IIF()

SELECT id, val, IIF(val IS NULL , 'True', 'False') AS val_null 
FROM MyTable;