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 上的默认值。 ISNULL
和 COALESCE
。 CASE
也是一个选项,它在顶部,但我还是把它包括在内
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 中的空值处理的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS、PHP 和 JSON 中使用来自 SQL Server 的空值