我试图找到用于编写T-SQL“IS NULL”的ANSI方法。 (更正,是'IN NULL') 互联网上的一些帖子说你可以使用coalesce让它像'IS NULL'一样工作
我喜欢这样做的原因:便携式代码。并且查询必须返回NULL
的行。
到目前为止,我创建了这个:
SELECT empid,
firstname,
lastname,
country,
coalesce(region,'unknown') AS regions ,
city
FROM HR.Employees
结果集如下所示:
empid firstname lastname country regions city
1 Sara Davis USA WA Seattle
2 Don Funk USA WA Tacoma
3 Judy Lew USA WA Kirkland
4 Yael Peled USA WA Redmond
5 Sven Buck UK unknown London
6 Paul Suurs UK unknown London
7 Russell King UK unknown London
8 Maria Cameron USA WA Seattle
9 Zoya Dolgopyatova UK unknown London
我确定了NULL
的行,但是如何从这个集合中过滤掉它们?
答案 0 :(得分:8)
IS NULL
和COALESCE
都是ANSI标准,几乎在所有合理的数据库中都可用。我想,你想要的结构是:
where region IS NULL
这是标准语法。
让COALESCE
像[{1}}一样工作,需要一个您知道不在数据中的值:
IS NULL
但是,您需要不同的日期和数字值。
答案 1 :(得分:3)
您似乎混淆IS NULL
(检查值是否为null的谓词)和T-SQL特定函数ISNULL(value, replace)
(后面没有空格和参数),这是类似的,但与COALESCE
不完全相同。
有关COALESCE
和ISNULL
与T-SQL的区别的详细信息,请参阅SQL - Difference between COALESCE and ISNULL?。
返回什么类型以及当所有参数都为空时发生的情况之间的微小差异,ISNULL
是一个函数,如果它不为null则返回第一个参数,如果是,则返回第二个参数。 COALESCE
返回第一个非null参数(可能需要两个以上)。
因此,这些中的每一个都可能用于以不同的方式解决您的问题,并且结果略有不同。
答案 2 :(得分:2)
IS NULL
是有效的ANSI SQL-92,称为空谓词。
<null predicate> ::= <row value constructor> IS [ NOT ] NULL
见SQL-92,第8.6段。
所以WHERE
列名IS NULL
完全有效。
当您编写WHERE
列名= NULL
或WHERE
列名<> NULL
时,ANSI SQL处理与T-SQL不同的NULL值的位。请参阅SET ANSI NULLS (Transact-SQL)。