6

我正在尝试找到编写 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,但是如何将它们从该集合中过滤掉?

4

3 回答 3

10

两者都是 ANSI 标准,IS NULL并且COALESCE在几乎所有合理的数据库中都可用。我认为你想要的结构是:

where region IS NULL

这是标准语法。

要进行COALESCE类似的工作,IS NULL需要一个您知道不在数据中的值:

where coalesce(region, '<null>') <> '<null>'

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

于 2013-02-09T20:05:45.757 回答
4

您似乎混淆IS NULL了(检查值是否为空的谓词)和 T-SQL 特定函数ISNULL(value, replace)(后面没有空格和参数),它与COALESCE.

请参阅SQL - COALESCE 和 ISNULL 之间的区别?有关T-SQL如何COALESCE和不同的详细信息。ISNULL

诸如返回什么类型以及所有参数都为 null 时会发生什么等细微差别ISNULL是一个函数,如果它不为 null,则返回第一个参数,如果是,则返回第二个参数。 COALESCE返回第一个非空参数(可能需要两个以上)。

因此,它们中的每一个都可能用于以不同的方式解决您的问题,并且结果略有不同。

于 2017-03-03T22:09:52.087 回答
2

IS NULL是有效的 ANSI SQL-92,称为空谓词。

<null predicate> ::= <row value constructor> IS [ NOT ] NULL

参见SQL-92,第 8.6 段。

所以WHERE列名IS NULL是完全有效的。

ANSI SQL 处理 NULL 值与 T-SQL 不同的地方是当您编写WHEREcolumn name= NULLWHEREcolumn name时<> NULL。请参阅SET ANSI NULLS (Transact-SQL)

于 2013-02-09T20:03:52.847 回答