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有些问题,可能暂时的。)
答案 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)
您可以使用NULL
或ISNULL
更改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;