2014-09-02 8 views
0

Я пытаюсь получить результаты в одном сценарии SQL, который будет охватывать несколько вариантов. Наконец, я получил результаты, которые мне нужны.Предложение SQL Server WHERE - совет

where 
(RTRIM(FMLS.REGION)) IN (@Region) and 
(RTRIM(FMB0.COUNTRY))IN (@Country) and 
(RTRIM(FMB0.SITECODE)) IN (@Site) and 
(RTRIM(FMB0.BLDGCODE)) IN (@Building) and 
( 
( 
    (RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
      AND 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
) 
OR 
( 
    (RTRIM(FMA0.SPACETYPE) = 'A-OFF-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-OFF-%') OR 
    (RTRIM(FMA0.SPACETYPE) = 'A-WKS-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-WKS-%')OR 
    (RTRIM(FMA0.SPACETYPE) LIKE 'CR-%' AND RTRIM(FMA0.SPCODE) NOT LIKE 'CR-%') 
) 
) 

Но что касается меня необходимость того, чтобы и в этих двух строках

(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
      AND 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 

, где я бы подумал, что это должно быть, или как я хочу, чтобы получить результаты, где FMA0.SPCODE пустым ИЛИ null для обеих линий, например,

(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL))) 
      OR 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL))) 

Но если я это сделаю, я получаю неправильные результаты. Я не могу понять это, возможно, слишком долго смотрел на это слишком долго или имел скобки в неправильном месте, но я не вижу, что я делаю неправильно ..... пожалуйста, помогите, это сводит меня с ума!

ответ

0

AND и OR с отрицательными выражениями несколько сложнее логически. Если вы сказали:

SPACETYPE NOT IN ('A-OFF-AS','A-WKS-AS') OR SPACETYPE NOT LIKE 'CR-%' 

Тогда всеSPACETYPE бы пройти этот тест. Рассмотрим значение, такое как 'THIS', его нет в первом списке, так что было бы хорошо. Рассмотрим значение, такое как 'A-OFF-AS'. Он - в первом списке, поэтому первое условие терпит неудачу. Итак, перейдите ко второму условию. Нет совпадения, поэтому он проходит. Вы можете попробовать это по множеству разных значений, и вы обнаружите, что OR передаст все. В самом деле, выше логика эквивалентна:

NOT (SPACETYPE IN ('A-OFF-AS','A-WKS-AS') AND SPACETYPE LIKE 'CR-%') 

Очевидно, что AND никогда не верно, так что NOT является ложным. (ПРИМЕЧАНИЕ: в этом обсуждении игнорируются значения NULL.)

Следовательно, OR не работает. К счастью для вас, AND действительно делает то, что вы хотите. Вам просто нужно привыкнуть к тонкостям логической логики.

Смежные вопросы