当value为null时,在查询中设置默认值

时间:2013-10-09 09:59:01

标签: sql sql-server-2005

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

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

它将在sql server 2005上运行

感谢

6 个答案:

答案 0 :(得分:24)

使用以下内容:

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得到第三个等等......

答案 1 :(得分:5)

使用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 
....

答案 2 :(得分:2)

如上所述,聚结溶液是优选的。作为一个额外的好处,你可以使用coalesce来对抗"派生"值与选定值的比较如下:

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

使用" iif"或"案例"你需要重复内联,而合并你不需要它,它可以让你避免使用" null"导致返回...

答案 3 :(得分:1)

您只需使用ISNULL(website, 'yourstring')

因此,您的查询将如下:

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

答案 4 :(得分:1)

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

问题1 +解决方案:

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

访问ISNULL功能始终返回TRUEFALSE。 因此,您必须围绕IIF用法使用自定义ISNULL功能。

问题2 +解决方案:

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

因此,如果您需要使用与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

答案 5 :(得分: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