Описание случая со сложным И / ИЛИ не работает, как задумано - PullRequest
1 голос
/ 25 мая 2011

Я ожидаю, что это вернет значение '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"

ЕСЛИ @WeekStartDay И @WeekEndDay ОБА = суббота или воскресенье ТОГДА 'C'

Хм, судя по ответам, похоже, что моя логика была намного сложнее, чем я думал.

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

И означает, что когда оба условия выполняются, ИЛИ означает, когда любое из условий выполняется.

@WeekStartDay - это «суббота». @WeekEndDay это "суббота".

Поэтому, если вы начнете ломать все это:

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

A выигрывает, потому что это первое условие, соответствующее вашим требованиям.

Вам нужно будет дополнительно объяснить, что вы пытаетесь сделать, потому что я не вижу, что мне нужно сделать, чтобы помочь исправить код.

2 голосов
/ 25 мая 2011

Подстановка значений параметров в виде литералов дает (для первого случая)

         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
1 голос
/ 25 мая 2011

(@ WeekEndDay <> «суббота») ИЛИ (@WeekEndDay <> «воскресенье») - проблема.

Это всегда будет возвращать истину.

Случай B: та же проблема, что и у

(@ WeekStartDay <> 'Saturday') ИЛИ (@WeekStartDay <> 'Sunday')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...