存储过程中的SQL case语句

时间:2013-11-21 15:58:26

标签: sql-server stored-procedures case

我有一个包含CASE语句的SQL Server存储过程。但是,如果多个条件为真,我需要附加值。

因此,如果特定记录的无效日期里程超出,我希望这两个值都显示在 NotArchiveableReason 专栏。

我将如何实现这一目标?

, CASE 
    WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date'
    WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage exceeded'
    WHEN LossStatusCode != 'R' THEN 'Status code is Review'
    Else 'Unknown issue'
    END
    As NotArchiveableReason

5 个答案:

答案 0 :(得分:3)

如果你想连接像Invalid Date, Mileage Exceeded这样的结果,那么你可能正在寻找类似的东西。

ISNULL(
    NULLIF(
        STUFF(
            CASE WHEN DateOfLoss < PolicyStartDate THEN ', Invalid Date' ELSE '' END
            + CASE WHEN MilesDriven > TotalMilesAllowed THEN ', Mileage exceeded' ELSE '' END
            + CASE WHEN LossStatusCode != 'R' THEN ', Status code is Review' ELSE '' END
        , 1, 2, '')
    ,'')
, 'Unknown issue')
As NotArchiveableReason

STUFF()删除了前导逗号。 NULLIF()将空字符串转换为null。当ISNULL()语句条件均未满足时,CASE将填充“未知问题”。

答案 1 :(得分:1)

, CASE WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date ' ELSE '' END
+ CASE WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage exceeded ' ELSE '' END
+ CASE WHEN LossStatusCode != 'R' THEN 'Status code is Review ' ELSE '' END
+ CASE WHEN NOT
       (   DateOfLoss < PolicyStartDate
       AND MilesDriven > TotalMilesAllowed
       AND LossStatusCode != 'R') THEN 'Unknown issue ' ELSE '' END
    As NotArchiveableReason

答案 2 :(得分:1)

,  CASE   WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date '        ELSE '' END
+  CASE   WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage exceeded ' ELSE '' END
+  CASE   WHEN LossStatusCode != 'R' THEN 'Status code is Review '      ELSE '' END
   CASE   WHEN DateOfLoss >= PolicyStartDate OR MilesDriven <= TotalMilesAllowed
                OR LossStatusCode = 'R'
          THEN 'Unknown issue' END                              As NotArchiveableReason

答案 3 :(得分:0)

如何扩展结果集并让应用程序处理它

, CASE WHEN DateOfLoss < PolicyStartDate THEN 1 ELSE 0 END as InvalidDate
, CASE WHEN MilesDriven > TotalMilesAllowed THEN 1 ELSE 0 END as MileageExceeded
, CASE WHEN LossStatusCode != 'R' THEN 1 ELSE 0 END as StatusCodeIsReview

那么如果全部为零则这是一个未知问题?

修改

你可以试试这个。这是使用内部选择来首先找到问题,然后将其组合。在此sollution中,您可以在内部选择中添加许多不同的检查,然后在外部将它们组合在一起。

select case when tmp.InvalidDate is null and tmp.MileageExceeded is null and tmp.StatusCodeIsReview is null then 'Unknown issue' else
stuff
(
    (
        COALESCE(', ' + NULLIF(tmp.InvalidDate, ''), '') + 
        COALESCE(', ' + NULLIF(tmp.MileageExceeded, ''), '') + 
        COALESCE(', ' + NULLIF(tmp.StatusCodeIsReview, ''), '')), 1, 2, '')
end as NotArchiveableReason from
(
    select *
    , CASE WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date' ELSE NULL END as InvalidDate
    , CASE WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage Exceeded' ELSE NULL END as MileageExceeded
    , CASE WHEN LossStatusCode != 'R' THEN 'Status Code Is Review' ELSE NULL END as StatusCodeIsReview
    from MyTest
) as tmp

答案 4 :(得分:0)

为什么不用3个案例陈述,然后在新的查询中CONCAT呢?

, CASE 
WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date'
END as 1

WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage exceeded'
END as 2

WHEN LossStatusCode != 'R' THEN 'Status code is Review'
END as 3

 select 1+2+3 As NotArchiveableReason