SQL:当一列为空值时求和3列?


73
SELECT 
    sum(TotalHoursM)
          + (TotalHoursT)
          + (TotalHoursW)
          + (TotalHoursTH)
          + (TotalHoursF) 
          AS TOTAL
FROM LeaveRequest

1
SQL Server未被标记的 ?
Kiquenet '18

Answers:


106

如果列的值为0,就可以了,我的猜测是您在使用Null值时遇到问题,在这种情况下,您将需要使用IsNull(Column, 0)以确保其始终始终为0。


2
Yonita是Michael的答案,回答您的问号是通过使用对号来回答的。
ahsteele,2009年

52
“ Yonita是Michael的答案,它回答了您的问号,即使用复选标记将其回答。”-我的大脑花了很长的时间来解析这句话。
jameshfisher

在MySQL中,ISNULL似乎只是一个1参数的布尔函数,但是正如omkarv的回答一样,IFNULL可以完成这项工作。
mwfearnley

4
IsNull不是可移植的,并且该问题未指定数据库。请参阅下文COALESCE,它是可移植的(如果性能并非始终最佳)。
jpmc26 2013年

3
问题是关于SQL的,但是指示的IsNull函数不是SQL原语。
路易斯·德·索萨

74

使用该ISNULL函数的先前答案仅对MS Sql Server是正确的。该COALESCE功能还将在SQL Server中工作。但也将在标准SQL数据库系统中工作。在给定的示例中:

SELECT sum(COALESCE(TotalHoursM,0))
          + COALESCE(TotalHoursT,0)
          + COALESCE(TotalHoursW,0)
          + COALESCE(TotalHoursTH,0)
          + COALESCE(TotalHoursF,0) AS TOTAL FROM LeaveRequest

这与ISNULL解决方案相同,唯一的区别是函数的名称。两者都可以在SQL Server中使用,但是COALESCE不是ANSI标准ISNULL。而且,COALESCE更灵活。 ISNULL将仅使用两个参数。如果第一个参数为NULL,则返回第二个参数的值,否则返回第一个参数的值。COALESCE将2设为'n'(我不知道'n'的限制)参数,并返回第一个参数not的值NULL。当只有两个参数时,效果与相同ISNULL


2
此外,Oracle SQL没有ISNULL。不过,以我的经验,使用NVL()可能会获得更好的结果:docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm
Darren

3
只是我要找的那个-postgres没有isull的ether。
毛罗·塔姆

3
Isnull在MySQL中无法按预期工作。Coalesce完成了工作。谢谢。
乔治,

1
IsNull不是SQL原语。因此,其他答案是不正确的,只有这个。
路易斯·索萨

ISNULL COALESCE
Kiquenet

16
SELECT sum(isnull(TotalHoursM,0)) 
         + isnull(TotalHoursT,0) 
         + isnull(TotalHoursW,0) 
         + isnull(TotalHoursTH,0) 
         + isnull(TotalHoursF,0))
AS TOTAL FROM LeaveRequest


3

您可以使用ISNULL

ISNULL(field, VALUEINCASEOFNULL)

1

看起来您想对所有列求和(我不确定“总和3列”来自何处),而不仅仅是TotalHoursM,所以请尝试以下操作:

SELECT 
    SUM(    ISNULL(TotalHoursM  ,0)
          + ISNULL(TotalHoursT  ,0)
          + ISNULL(TotalHoursW  ,0)
          + ISNULL(TotalHoursTH ,0)
          + ISNULL(TotalHoursF  ,0) 
       ) AS TOTAL
    FROM LeaveRequest

感谢您在回答此问题近8年后的不赞成票!哈哈,这是其他人在这个问题上给出的完全相同的答案。我在他们面前回答,但他们有很多赞成票。
KM。

1

您也可以使用 nvl(Column,0)


3
nvl特定于oracle pl / sql。
AWD

0

我会尝试这样的:

select sum (case when TotalHousM is null then 0 else TotalHousM end)
       + (case when TotalHousT is null then 0 else TotalHousT end)
       + (case when TotalHousW is null then 0 else TotalHousW end)
       + (case when TotalHousTH is null then 0 else TotalHousTH end)
       + (case when TotalHousF is null then 0 else TotalHousF end)
       as Total
From LeaveRequest

但是我喜欢这种解决方案,因为它也可以处理那些值为空而不是NULL的情况。您将必须添加LEN()>
0。– webworm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.