【问题标题】:ANSI equivalent of IS NULLANSI 等效于 IS NULL
【发布时间】:2013-02-09 19:52:30
【问题描述】:

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

【问题讨论】:

  • 如果有更好的过滤方法,请告诉。
  • 所以您希望查询返回所有上述行,但regions 值为unknown 的行除外?
  • 你是想说unknownNULL吗?
  • 您希望只查看 NULL 行吗?
  • @chihwahli 。 . .我假设您问题的第一行是关于IS NULL 而不是IN NULL(我不熟悉)。

标签: sql coalesce isnull ansi-sql


【解决方案1】:

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

where region IS NULL

这是标准语法。

要让COALESCEIS NULL 一样工作,需要一个您知道不在数据中的值:

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

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

【讨论】:

  • 我在网上阅读了几页,告诉我 IS NOT 只是 T-SQL。但那是错误的。感谢您的指正。我重写了我的原始代码,只是为了尝试合并:
  • SELECT empid,firstname,lastname,country,coalesce(region,'unknown') AS region ,city FROM HR.Employees where coalesce(region, '') = '' or region = N'WA' 现在返回带有 NULL 的行。然后将其存档并在将来使用“IS NULL”。再次感谢。
【解决方案2】:

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

请参阅SQL - Difference between COALESCE and ISNULL?,详细了解COALESCEISNULL 对于 T-SQL 的不同之处。

除了返回什么类型以及所有参数都为空时会发生什么等细微差别之外,ISNULL 是一个函数,如果它不为空,则返回第一个参数,如果为空,则返回第二个参数。 COALESCE 返回第一个非空参数(可以多于两个)。

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

【讨论】:

    【解决方案3】:

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

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

    参见SQL-92,第 8.6 段。

    所以WHEREcolumn nameIS NULL 完全有效。

    ANSI SQL 处理 NULL 值不同于 T-SQL 的地方是当您编写 WHERE 列名 = NULLWHERE 列名 &lt;&gt; NULL 时。见SET ANSI NULLS (Transact-SQL)

    【讨论】:

    • 非常感谢您指出它是ANSI,阅读错误的页面并错误地思考。
    猜你喜欢
    • 2011-04-15
    • 2022-11-21
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多