2013-11-21 104 views
3

我有一個包含CASE語句的SQL Server存儲過程。但是,如果多個條件爲真,我需要追加這些值。要顯示在NotArchiveableReason存儲過程中的SQL case語句

所以,如果一個特定的記錄有一個無效的日期里程超過,我想這兩個值。

我該如何做到這一點?

, 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 

回答

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()將空字符串轉換爲空。當CASE聲明條件都不符合時,ISNULL()將填充「未知問題」。

+0

完美的工作。謝謝你的幫助。 – Csharp

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 

那麼,如果一切爲零,這是一個未知的問題?

編輯

你可以試試這個呢。這是使用內部選擇首先找到問題,然後再組合它。在這種溶劑中,您可以在內部選擇中添加許多不同的檢查,然後在外部將它們組合起來。

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 
+0

這個解決方案是否會返回一個比我想要更多的列...(尤其是如果我增加更多的條件,在存儲過程) – Csharp

+0

但是,如果你添加更多條件的SP也只需要添加的更多的組合「問題」,並使其更加複雜化! – aweis

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 
+0

當我嘗試你的代碼時,我得到了一些包含所有4種組合的記錄(「無效的日期里程超出狀態代碼是審查未知問題」) – Csharp

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 
+0

你打算在最後一個CASE語句前加一個'+'嗎? – Csharp

+0

@Csharp是的,我會分析由多個Case語句返回的字符串。在所有Else子句中,我添加了空字符串,但沒有空格「,但實際返回的值」無效日期「有尾隨空格。 –

+0

因爲在Case語句中,如果您在一個Case語句中檢查所有條件,只要它獲得第一次打擊,就會停止繼續查找更多WHEN,並返回WHEN爲true的第一個THEN'Value',如下所示的Concatinating Case Statements這種力量檢查所有的案件,即使一個或無是真實的:) –

0

爲什麼不去3個case語句,然後在一個新的查詢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