MS SQL Server 2008 中的空值处理

Posted

技术标签:

【中文标题】MS SQL Server 2008 中的空值处理【英文标题】:Null Processing in MS SQL Server 2008 【发布时间】:2011-09-29 18:06:04 【问题描述】:

我不是 SQL DBA,但我遇到了问题。我们运行 MS SQL 2008 服务器并刚刚从 MS SQL 2000 升级它。我正在尝试运行为 MS SQL 2000 中的数据库创建的查询,并将结果用于我们的邮件列表。


查询是:

SELECT DISTINCT Title, FirstName, MiddleInitial, LastName, Suffix, 
CompanyName, BAddress, BAddress2, BCity, BState, BZip
FROM MailingExportView
WHERE     AdvanceMailing = 0 
ORDER BY BZip, LastName

这给了我们类似的东西:

Title   FirstName   MiddleInitial   LastName    Suffix  CompanyName BAddress    BAddress2   BCity   BState  BZip
Mr. Bob NULL    Smith   NULL    NULL    12345 Main , Anytown    State, NULL NULL

我不想得到 NULL。如果理想情况下该字段为空,我希望它返回空白。

我从其他网站和这里阅读了关于 Null 处理的信息;

http://technet.microsoft.com/en-us/library/ms170707.aspx

我尝试重新排列,以便 ISNULL 将空值放在不同的表中:

How to replace blank (null ) values with 0 for all records?

http://bytes.com/topic/sql-server/answers/888443-convert-null-blank-if-not-null-remove-commas-string

http://www.w3schools.com/sql/sql_isnull.asp

我在这里不知所措。有人可以帮帮我吗?

【问题讨论】:

4 COALESCE 与 2 ISNULL,所以选择吧。唯一的区别是 (1) coalesce 将接受任意数量的参数并返回列表中第一个不为空的参数,并且 (2) isnull 更容易键入。 【参考方案1】:

将 COALESCE 包裹在您想要空白的列周围

COALESCE(MiddleInitial,'') AS MiddleInitial   

重复其他列

【讨论】:

【参考方案2】:

如果你想要的只是一个空白而不是空值,试试

COALESCE(FieldThatMayBeNull, '') as FieldThatMayBeNull

【讨论】:

【参考方案3】:

将任何可能为空的字段的选择更改为ISNULL(Column, '')...

SELECT DISTINCT 
     ISNULL(Title, '') AS Title, 
     ISNULL(FirstName, '') FirstName, 
     ISNULL(MiddleInitial, '') MiddleInitial, 
     ISNULL(LastName, '') LastName, 
     ISNULL(Suffix, '') Suffix, 
     ISNULL(CompanyName, '') CompanyName, 
     ISNULL(BAddress, '') BAddress, 
     ISNULL(BAddress2, '') BAddress2, 
     ISNULL(BCity, '') BCity, 
     ISNULL(BState, '') BState, 
     ISNULL(BZip, '') BZip
FROM MailingExportView
WHERE     AdvanceMailing = 0 
ORDER BY BZip, LastName

【讨论】:

【参考方案4】:

没有向我们展示您尝试了什么,就无法确定您的问题是什么。

也就是说,有两种标准方法可以将 null 转换为 select 上的默认值。 ISNULLCOALESCECASE 也是一个选项,它在顶部,但我还是把它包括在内

SELECT DISTINCT 
   Title, 
   FirstName, 
   COALESCE(MiddleInitial, '') MiddleInitial, 
   LastName, 
   ISNULL(Suffix,'') Suffix, 
   CompanyName, 
   CASE WHEN BAddress IS NULL THEN '' ELSE BAddress END BAddress, 

【讨论】:

【参考方案5】:
SELECT DISTINCT
COALESCE(Title,'') Title,
COALESCE(FirstName,'') FirstName,
COALESCE(MiddleInitial,'') MiddleInitial,
COALESCE(LastName,'') LastName,
COALESCE(Suffix,'') Suffix,
COALESCE(CompanyName,'') CompanyName,
COALESCE(BAddress,'') Baddress,
COALESCE(BAddress2,'') Baddress2,
COALESCE(BCity,'') BCity,
COALESCE(BState,'') BState,
COALESCE(BZip,'') BZip
FROM MailingExportView
WHERE AdvanceMailing = 0 
ORDER BY BZip, LastName ;

【讨论】:

【参考方案6】:

我猜你可以在你的情况下使用 ISNULL() 函数,类似于以下内容:

    SELECT DISTINCT ISNULL(Title, ''), ISNULL(FirstName, ''), ISNULL(MiddleInitial, ''), ISNULL(LastName, ''), ISNULL(Suffix, ''),  ISNULL(CompanyName, ''), ISNULL(BAddress, ''), ISNULL(BAddress2, ''), ISNULL(BCity, ''), ISNULL(BState, ''), ISNULL(BZip, '') FROM MailingExportView WHERE     AdvanceMailing = 0  ORDER BY BZip, LastName 

【讨论】:

以上是关于MS SQL Server 2008 中的空值处理的主要内容,如果未能解决你的问题,请参考以下文章

检查 MS Access SQL 语句中的空值

在 iOS、PHP 和 JSON 中使用来自 SQL Server 的空值

SQL Server数据库C#中的空值

访问不允许SQL-Server列中的空值的INSERT或UPDATE(访问运行时错误3162)

时间戳 StructField 中的空值

从sql table处理PSCustomObject中的空值。无法转换对象