具有复杂AND / OR的案例陈述无法按预期工作

时间:2011-05-25 14:07:37

标签: tsql

我希望这会返回'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

我的预期功能是:

我想把它变成憎恶

如果@WeekStartDay =周六或周日且@WeekEndDay不是周六或周日那么'A'

如果@WeekEndDay =周六或周日且@WeekStartDay不是周六或周日,那么'B'

IF @WeekStartDay和@WeekEndDay BOTH =周六或周日那么'C'

从回答中看起来我的逻辑比我想象的要多得多。

3 个答案:

答案 0 :(得分:2)

AND表示当两个条件都为真时,OR表示任一条件为真。

@WeekStartDay是&#34;星期六&#34;。 @WeekEndDay是&#34;星期六&#34;。

因此,如果你开始打破它:

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

A获胜,因为这是符合您要求的第一个条件。

您必须进一步解释您要做的事情,因为我无法看到我需要做些什么来帮助修复代码。

答案 1 :(得分: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

答案 2 :(得分:1)

(@ WeekEndDay&lt;&gt;'星期六')或(@WeekEndDay&lt;&gt;'星期日')是问题所在。

总是会回归真实。

案例B:与

有同样的问题

(@ WeekStartDay&lt;&gt;'星期六')或(@WeekStartDay&lt;&gt;'星期天')