如何修复混合AND和OR条件的查询?

时间:2012-05-01 00:25:40

标签: sql oracle boolean-logic

我需要在三列上查询具有过滤条件的表:

select * 
from table a 
where a.order = car 
and a.color !=red 
or a.automatic !=auto

这只是检查第一个条件并忽略第二个条件。

我无法理解它:(

2 个答案:

答案 0 :(得分:6)

从你的问题中不清楚,但你可能需要的只是围绕你的OR条件包裹parens

鉴于以下表和行

CREATE TABLE table_a 
    (
     id int primary key, 
     a_order varchar2(20), 
     color varchar2(40),
     automatic varchar2(10)
    )

/


INSERT INTO table_a VALUES (1,'car','red','auto')     /
INSERT INTO table_a VALUES (2,'car','red','manual')   /
INSERT INTO table_a VALUES (3,'car','blue','auto')    /
INSERT INTO table_a VALUES (4,'car','blue','manual') /
INSERT INTO table_a VALUES (5,'truck','red','auto')   /
INSERT INTO table_a VALUES (6,'truck','red','manual') /
INSERT INTO table_a VALUES (7,'truck','blue','auto') /
INSERT INTO table_a VALUES (8,'truck','blue','manual') /

此选择语句将返回记录2,3和4,因为它们都是汽车,并且是蓝色或手动

SELECT * 
FROM   table_a a 
WHERE  a.a_order = 'car' 
       AND ( a.color != 'red' 
              OR a.automatic != 'auto' ) 

Demo

另一个选择是使用De Morgan's law执行以下操作“否定的否定是否定的结合。”

SELECT * 
FROM   table_a a 
WHERE  a.a_order = 'car' 
    AND NOT ( a.color = 'red' 
             AND a.automatic = 'auto' ) 

Demo

答案 1 :(得分:2)

AND的优先级高于OR逻辑运算符。您可以在括号内使用OR条件。

SELECT * 
  FROM table_a a 
 WHERE a.a_order = 'car' 
   AND NOT ( a.color = 'red' 
        AND a.automatic = 'auto' )