Sql server 存储过程中的SQL case语句

Sql server 存储过程中的SQL case语句,sql-server,stored-procedures,case,Sql Server,Stored Procedures,Case,我有一个包含CASE语句的SQL Server存储过程。但是,如果多个条件为真,我需要附加这些值 因此,如果某个特定记录的日期和里程数无效,我希望这两个值都显示在NotArchiveableReason列中 我将如何做到这一点 , CASE WHEN DateOfLoss < PolicyStartDate THEN 'Invalid Date' WHEN MilesDriven > TotalMilesAllowed THEN 'Mileage exceeded'

我有一个包含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

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

, 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
那么,如果全部为零,这是一个未知问题

编辑

你可以试试这个。这是使用内部选择来首先查找问题,然后将其合并。在此解决方案中,您可以在内部选择中添加许多不同的检查,然后在外部选择中根据需要组合它们

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

如果您想要连接诸如无效日期、里程数超过等结果,那么您可能需要这样的结果

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

填充将删除前导逗号。NULLIF将空字符串转换为null。当不满足任何CASE语句条件时,ISNULL将填充未知问题

为什么不使用3个case语句,然后在新的查询中对它们进行查询

, 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

此解决方案将返回比我想要的更多的列。。。特别是如果我向存储过程中添加更多条件,但如果您向SP中添加更多条件,您也只需添加更多问题组合,使其更复杂!您是否打算在最后一个CASE语句前面加一个“+”?@Csharp是的,我将对multiple CASE语句返回的字符串加一个“+”。在all Else子句中,我添加了不带空格的空字符串,但实际返回值“Invalid Date”有一个尾随空格。因为在Case语句中,如果您检查一个Case语句中的所有条件,它会在第一次命中时停止查找更多的WHEN,然后返回第一个“值”,其中WHEN为true,对所有案例进行强制检查(即使只有一个或没有)这样的案例陈述是正确的:当我尝试您的代码时,我得到了所有4种组合的一些记录“无效日期里程超出状态代码为审阅未知问题”
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
, 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