20

我正在运行一个非常简单的查询,但是对于某些结果,一个字段中的值为空。如果它的值为空,我如何将该值设置为“字符串”?

就像是

SELECT RegName,
    RegEmail,
    RegPhone,
    RegOrg,
    RegCountry,
    DateReg,
    (Website IS NULL? 'no website' : Website) AS WebSite
FROM RegTakePart
WHERE Reject IS NULL

它将在 sql server 2005 上运行

谢谢

4

6 回答 6

37

使用以下内容:

SELECT RegName,
       RegEmail,
       RegPhone,
       RegOrg,
       RegCountry,
       DateReg,
       ISNULL(Website,'no website')  AS WebSite 
FROM   RegTakePart 
WHERE  Reject IS NULL

或者,@Lieven 指出:

SELECT RegName,
       RegEmail,
       RegPhone,
       RegOrg,
       RegCountry,
       DateReg,
       COALESCE(Website,'no website')  AS WebSite 
FROM   RegTakePart 
WHERE  Reject IS NULL

COALESCE 的动态是您可以定义更多参数,因此如果第一个为 null 则获取第二个,如果第二个为 null 则获取第三个等等......

于 2013-10-09T10:00:17.290 回答
10

如上所述,优选聚结解决方案。作为一个额外的好处,您可以针对“派生”值与选定值使用合并,如下所示:

SELECT
       {stuff},
       COALESCE( (select count(*) from tbl where {stuff} ), 0 )  AS countofstuff
FROM
       tbl
WHERE
       {something}

使用“iif”或“case”,您需要重复内联,而使用合并则不需要,它允许您避免在返回时出现“null”结果......

于 2016-04-28T14:12:19.837 回答
9

使用CASE

SELECT regname, 
       regemail, 
       regphone, 
       regorg, 
       regcountry, 
       datereg, 
       CASE 
         WHEN website IS NULL THEN 'no website' 
         ELSE website 
       END AS WebSite 
FROM   regtakepart 
WHERE  reject IS NULL 

COALESCE

....
COALESCE(website, 'no website') AS WebSite 
....
于 2013-10-09T10:00:50.020 回答
2

你只需使用ISNULL(website, 'yourstring').

因此,您的查询将类似于:

SELECT RegName,
    RegEmail,
    RegPhone,
    RegOrg,
    RegCountry,
    DateReg,
    ISNULL(website, 'no website') AS WebSite
FROM RegTakePart
WHERE Reject IS NULL
于 2013-10-09T10:00:30.230 回答
2

为了避免给其他用户带来一些问题:

问题 1 + 解决方案:

如果您计划将该函数与 Access 数据库一起使用,请注意在 Access 中实现的函数与 SQL Server 实现不同ISNULL的事实。ISNULL

访问ISNULL函数总是返回TRUEor FALSE。因此,您必须IIF围绕您的ISNULL使用情况使用自定义函数。

问题 2 + 解决方案:

此外,如果您希望为列使用与别名相同的字段名称,这可能会导致 Access 数据库引擎通知您该字段存在“循环引用”。

所以如果需要使用和 Alias 一样的字段名,只需要在字段名前加上表名即可。(示例:您必须使用 RegTakePart.Website而不是简单地使用Website)。这样,您可以自由地Website用作列的别名。

避免这两个问题的全局工作(和测试)SQL 查询如下:

SELECT RegName,
    RegEmail,
    RegPhone,
    RegOrg,
    RegCountry,
    DateReg,
    IIF(RegTakePart.Website IS NULL, 'no website, RegTakePart.Website) AS Website
FROM RegTakePart
WHERE Reject IS NULL
于 2016-10-15T09:07:03.007 回答
0

检查 COALESCE 功能

http://msdn.microsoft.com/en-us/library/ms190349.aspx

SELECT RegName,RegEmail,RegPhone,RegOrg,RegCountry,DateReg,COALESCE(Website, 'no website') AS WebSite FROM RegTakePart WHERE Reject IS NULL
于 2013-10-09T10:02:03.313 回答