2011-05-25 102 views
1

我期待這返回'C'的值,但它返回'A'。我似乎無法弄清楚爲什麼這不起作用,因爲我的邏輯看起來很合理。案例陳述複雜和/或不按預期工作

DECLARE @WeekStartDay varchar(10) 
DECLARE @WeekEndDay varchar(10) 
SET @WeekStartDay = 'Saturday' 
SET @WeekEndDay = 'Saturday' 



SELECT 

    CASE 

     WHEN (
       ((@WeekStartDay = 'Saturday') OR (@WeekStartDay = 'Sunday')) 
         AND 
       ((@WeekEndDay <> 'Saturday') OR (@WeekEndDay <> 'Sunday')) 
      ) 
      THEN 'A' 

     WHEN (
       ((@WeekEndDay = 'Saturday') OR (@WeekEndDay = 'Sunday')) 
         AND 
       ((@WeekStartDay <> 'Saturday') OR (@WeekStartDay <> 'Sunday')) 
      ) 
      THEN 'B' 
     WHEN (
       ((@WeekEndDay = 'Saturday') OR (@WeekEndDay = 'Sunday')) 
         AND 
       ((@WeekStartDay = 'Saturday') OR (@WeekStartDay = 'Sunday')) 
      ) 
      THEN 'C' 

    END AS Result 

我預期的功能是:

我試圖讓它deteremine

中頻@WeekStartDay =週六或週日,@WeekEndDay IS NOT週六或週日THEN 'A'

如果@WeekEndDay =週六或週日並且@WeekStartDay不是週六或週日那麼'B'

如果@WeekStartDay和@WeekEndDay BOTH =星期六或星期天那麼'C'

從回答嗯看起來像我的邏輯是比我想象的方式更多。

回答

2

代入作爲文字給出的參數值(對於第一殼體)

  WHEN ((('Saturday' = 'Saturday') OR ('Saturday' = 'Sunday')) 
          AND 
       (('Saturday' <> 'Saturday') OR ('Saturday' <> 'Sunday'))) 

哪個是

  WHEN ((True OR False) AND (False OR True)) 

哪個是

  WHEN (True AND True) 

哪個是

  WHEN (True) 

我想你需要

SELECT 
    CASE WHEN @WeekStartDay IN ('Saturday', 'Sunday') THEN 
     CASE WHEN @WeekEndDay IN ('Saturday', 'Sunday') THEN 
      'C' 
     ELSE 
      'A' 
     END 
    ELSE 
     CASE WHEN @WeekEndDay IN ('Saturday', 'Sunday') THEN 
      'B' 
     ELSE 
      NULL /*You haven't said what should happen here?*/ 
     END 
    END 
AS Result 
+0

非常感謝您的幫助!哦,哇,是的,這使得嵌套像這樣的案例陳述和使用IN更有意義。我很感激! – thirdcoastx 2011-05-25 14:33:37

1

(@WeekEndDay <>'Saturday')或(@WeekEndDay <>'Sunday')是問題所在。

這將始終返回true。

案例B:有

(@WeekStartDay <> '星期六')或(@WeekStartDay <> '星期天')

2

了同樣的問題,是指當兩個條件都爲真,或手段時兩種情況都是如此。

@WeekStartDay是「星期六」。 @WeekEndDay是「星期六」。因爲它是第一個條件滿足您的要求

A: (TRUE OR FALSE) AND (FALSE OR TRUE) = TRUE AND TRUE = TRUE 

A勝:

因此,如果你開始打破了這一切。

你必須進一步解釋你正在做什麼,因爲我看不到我需要做什麼來幫助修復代碼。

+0

我試圖讓它deteremine 中頻@WeekStartDay =週六或週日,@WeekEndDay IS NOT週六或週日THEN「A」 中頻@WeekEndDay =星期六或週日和@WeekStartDay不是星期六或星期日然後'B' 如果@WeekStartDay和@WeekEndDay BOTH =星期六或星期日那麼'C' 嗯,看起來像我的邏輯是比我想象的更多的方式。 – thirdcoastx 2011-05-25 14:20:52