2013-03-25 2 views
1

Мне интересно, что я делаю неправильно с этими операторами.SQL Logical Operators - попытка получить правильные результаты

В конечном итоге я пытаюсь получить список людей, в которых отсутствует один из p.TEST ИЛИ p.DL, но не оба они на одного человека.

select .... 
    from .... 

    WHERE 

((p.TEST is null OR p.DL is null) OR 
(p.TEST = 0 or p.DL = 0) OR 
(p.TEST = 1 or p.DL = 0) OR 
(p.TEST = 0 or p.DL = 1)) 
+0

, что представляет собой «пропущенной ». Это null, 0 или 1? – Phil

+0

Это связано с пользовательским вводом - нулевой или 0 будет отсутствовать. – scottO

+0

обновил мой ответ в матче – Phil

ответ

1
select .. 
from .. 
where 
    -- one missing 
    (isnull(p.test,0) = 0 or isnull(p.dl,0) = 0 
    and 
    -- but not both 
    not (isnull(p.test,0) = 0 and isnull(p.dl,0) = 0) 
+0

Это потрясающая идея для будущего использования. Тем не менее, я просто создаю отчет, и мне не разрешено изменять информацию. – scottO

+0

@scottO Я ничего не изменяю, что ты имеешь в виду? – Phil

+0

О, я думал, что isnull() заменит значения - – scottO

1

но не оба из них на одного человека.

Это не гарантируется в ваших заявлениях.

((p.TEST is null OR p.DL is null) OR // if both are null this is true 
(p.TEST = 0 or p.DL = 0) OR   // if both are zero this is true 
(p.TEST = 1 or p.DL = 0) OR 
(p.TEST = 0 or p.DL = 1)) 

Вы должны явно проверить, как:

((a is null) and (b is not null)) OR 
((b is null) and (a is not null)) 
// etc. for zero values: 
((a = 0) and (b <> 0)) OR 
((b = 0) and (a <> 0)) 
//... 

И даже тогда вы получите результаты, как a = 0 но b = null поэтому вам может понадобиться, чтобы отфильтровать их тоже.

+0

Gotcha. Спасибо! – scottO

+0

Люди, которые вводят информацию, иногда ничего не вводят, поэтому я проверяю «isnull» и «0». – scottO

+0

((p.TEST is null) и (p.DL не является нулевым)) ИЛИ ((p.TEST не является нулевым) и (p.DL имеет значение null)) ИЛИ ((p.TEST = 0) и (p.DL = 1)) ИЛИ ((p.TEST = 1) и (p.DL = 0)) и НЕ ((p.TEST = 0 ИЛИ p.TEST равно нулю) и \t \t (p.DL = 0 ИЛИ p.DL имеет значение null)) - вот что я сейчас пытаюсь сделать – scottO

0

Я думаю, что это должно быть

( 
    (p.TEST is null AND p.DL is not null) OR 
    (p.TEST is not null AND p.DL is null) 
) 

... и так далее

Это потому, что вы хотите знать, когда один присутствует и другой отсутствует

+0

Спасибо! что делает его более понятным. – scottO

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