2013-02-09 55 views
3

我正试图找到ANSI方式来编写T-SQL'IS NULL'。 (纠正,是“IN NULL”) 在互联网上的一些帖子说,你可以使用聚结,使其工作像“IS NULL”ANSI等效的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

如果有更好的方法来过滤,请告诉。 – 2013-02-09 19:53:19

+0

所以你希望你的查询返回上述所有的行,除了那些'regions'值为'unknown'的行? – 2013-02-09 19:57:05

+0

你想说'未知'是'NULL'吗? – Kermit 2013-02-09 19:57:22

回答

6

IS NULLCOALESCE都是ANSI标准,可用于几乎所有合理的数据库。你想,我觉得结构件,是:

where region IS NULL 

这是标准的语法。

要有COALESCE工作就像IS NULL要求您知道是不是在数据的值:

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

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

+0

我在网上阅读了几页,告诉我不是只有T-SQL。但那是错误的。感谢您的更正。我重写了我的原始代码,只是为了试用coalesce: – 2013-02-09 20:36:25

+0

SELECT empid,firstname,lastname,country,coalesce(region,'unknown')AS区域,城市 FROM HR.Employees 其中coalesce(区域'')= '' 或区域= N'WA' 现在返回包含NULL的行。将它归档并在未来使用'IS NULL'。再次感谢。 – 2013-02-09 20:37:44

2

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

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

参见SQL-92的段落8.6。

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

ANSI SQL处理与T-SQL不同的NULL值的位是当您编写WHERE列名称= NULLWHERE列名<> NULL。见SET ANSI NULLS (Transact-SQL)

+0

非常感谢您指出它是ANSI,阅读错误的页面并错误地思考。 – 2013-02-09 20:39:14

0

你似乎是混乱IS NULL(检查,看看是否值为null谓词)和T-SQL特定功能ISNULL(value, replace)(没有空格,并在其后的参数),这是类似,但不完全相同COALESCE

有关T-SQL的COALESCEISNULL如何不同的详细信息,请参阅SQL - Difference between COALESCE and ISNULL?

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

因此,这些中的每一个都可能以不同的方式用于解决问题,结果稍有不同。