2015-02-09 4 views
0

Мне нужно показать только записи, где ship_status является окончательным И поле1 не равно null ИЛИ поле2 не равно null. Ship_status = final - это ДОЛЖНО, чтобы поле1/поле2 было либо или, но должно быть истинным. Но когда я пытаюсь выполнить свой запрос, он возвращает все результаты?Использование обоих и/или в запросе SQL

Create Table #123 
(
    ID int, 
    ship_status varchar(100), 
    field2 varchar(100), 
    field3 varchar(100) 
) 

Insert Into #123 Values 
('1','Final', 'No', 'Null'), 
('2', 'Test', 'Null', 'Null'), 
('3','Null', 'Null', 'Null'), 
('4','Null', 'Null', 'Null'), 
('5','Final', 'Null', 'No'), 
('6','Final', 'Null', 'No'), 
('7','Final', 'Null', 'No') 

Select * from #123 
WHERE field2 IS NOT NULL OR field3 IS NOT NULL 
AND ship_status IN ('Final') 

ответ

1

Вы должны сгруппировать ваши OR логику вместе (с кронштейнами) как так:

Select * from #123 
WHERE (field2 IS NOT NULL OR field3 IS NOT NULL) 
     AND ship_status IN ('Final') 

Также я изменил бы AND часть к проверке равенства, если вы просто ищете для одного статус:

ship_status = 'Final' 
0

Именно то, что сказал @Tanner. Логические операции в SQL имеет приоритет выполнения, так И имеет более высокий приоритет, чем ИЛИ Некоторые подробности здесь: sql-logic-operator-precedence-and-and-or

0

Прежде всего проверить свои данные, он должен быть:

Insert Into #123 Values 
('1','Final', 'No', Null), 
('2', 'Test', Null, Null), 
('3','Null', Null, Null), 
('4','Null', Null, Null), 
('5','Final', Null, 'No'), 
('6','Final', Null, 'No'), 
('7','Final', Null, 'No') 

Если поэтому в вашем запросе могут быть:

Select ID, ship_status, field2, field3 from #123 
WHERE (field2 IS NOT NULL OR field3 IS NOT NULL) 
AND ship_status = 'Final' 

В противном случае у вас есть varchar со строковым значением «Null». В этом случае:

Select ID, ship_status, field2, field3 from #123 
WHERE (field2 <> 'NULL' OR field3 <> 'NULL') 
AND ship_status = 'Final' 
Смежные вопросы