ANSI等价的IS NULL

时间:2013-02-09 19:52:30

标签: sql coalesce isnull ansi-sql

我试图找到用于编写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的行,但是如何从这个集合中过滤掉它们?

3 个答案:

答案 0 :(得分:8)

IS NULLCOALESCE都是ANSI标准,几乎在所有合理的数据库中都可用。我想,你想要的结构是:

where region IS NULL

这是标准语法。

COALESCE像[{1}}一样工作,需要一个您知道不在数据中的值:

IS NULL

但是,您需要不同的日期和数字值。

答案 1 :(得分:3)

您似乎混淆IS NULL(检查值是否为null的谓词)和T-SQL特定函数ISNULL(value, replace)(后面没有空格和参数),这是类似的,但与COALESCE不完全相同。

有关COALESCEISNULL与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列名= NULLWHERE列名<> NULL时,ANSI SQL处理与T-SQL不同的NULL值的位。请参阅SET ANSI NULLS (Transact-SQL)