SQL查询,如果值为空则返回1。

84

我有一个查询,它返回在我们系统中设置的汇率值。不是每个订单都会有汇率 (currate.currentrate),因此查询会返回空值。

我能否让它返回1而不是空值?

就像一个if语句一样:

 if isnull(currate.currentrate) then 1 else currate.currentrate 

以下是我的查询。非常感谢您的帮助!

 SELECT     orderhed.ordernum, orderhed.orderdate, currrate.currencycode,  currrate.currentrate
 FROM         orderhed LEFT OUTER JOIN
                  currrate ON orderhed.company = currrate.company AND orderhed.orderdate = currrate.effectivedate

4
查看ISNULL文档(即:按照其设计使用它)。 - user166390
1
@pst COALESCE 是 SQL 标准,并且通常在这些情况下建议使用。此外,它们对数据类型的响应方式存在显著差异。也许您应该在评论中加入这样的额外信息。 - swasheck
@swasheck文档中已经有这些内容,它还链接到COALESCE。 - user166390
6个回答

143

您可以使用CASE语句。

SELECT 
    CASE WHEN currate.currentrate IS NULL THEN 1 ELSE currate.currentrate END
FROM ...

3
或许你可以生成执行计划并告诉我们它有什么不同,对吧?虽然没必要给这条回答点踩。 - swasheck
4
下一个阅读这段文字的开发者会想:“他们为什么不直接使用ISNULLCOALESCE?”如果他们花费时间去找出为什么或者如何做的话,每一秒都将是浪费的时间。 - AakashM
1
我只是想学习更多,但使用@ek0nomik提供的解决方案可以正确快速地工作。我相信在最终实现这个目标的过程中有不同的方法,但对于我的特定应用程序来说,为什么会有这么多评论认为它不可接受呢?我是否没有看到更大的图景? - jenhil34
10
“Select IsNull(currate.currentrate, 1)”是一个更好的答案,就是这样。 - Dominic Goulet
4
“我不买账”听起来不像是在引出一个完整的答案。这是我的个人意见。 - Kermit
显示剩余9条评论

55

你可以使用COALESCE函数:

SELECT  orderhed.ordernum, 
    orderhed.orderdate, 
    currrate.currencycode,  
    coalesce(currrate.currentrate, 1) as currentrate
FROM orderhed 
LEFT OUTER JOIN currrate 
    ON orderhed.company = currrate.company 
    AND orderhed.orderdate = currrate.effectivedate

甚至还可以使用IsNull()函数:

SELECT  orderhed.ordernum, 
    orderhed.orderdate, 
    currrate.currencycode,  
    IsNull(currrate.currentrate, 1) as currentrate
FROM orderhed 
LEFT OUTER JOIN currrate 
    ON orderhed.company = currrate.company 
    AND orderhed.orderdate = currrate.effectivedate

这篇文章可以帮助你决定在SQL Server中使用COALESCE还是IsNull

http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/


有用的链接,但如果答案包括这些要点会更好。 - Max Barraclough

18

9

a) 如果您想在值为空时获得0

SELECT isnull(PartNum,0) AS PartNumber, PartID
FROM Part
b) 如果您想在值为 null 时得到 0,否则得到 1
SELECT 
  (CASE
    WHEN PartNum IS NULL THEN 0
    ELSE 1
  END) AS PartNumber,
  PartID
FROM Part

2
SELECT orderhed.ordernum, orderhed.orderdate, currrate.currencycode,  

case(currrate.currentrate) when null then 1 else currrate.currentrate end

FROM orderhed LEFT OUTER JOIN currrate ON orderhed.company = currrate.company AND orderhed.orderdate = currrate.effectivedate  

0

尝试像下面这样...

CASE 
WHEN currate.currentrate is null THEN 1
ELSE currate.currentrate
END as currentrate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接