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

san*_*ndy 1 sql oracle boolean-logic

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

select * 
from table a 
where a.order = car 
and a.color !=red 
or a.automatic !=auto
Run Code Online (Sandbox Code Playgroud)

这只是检查第一个条件而忽略第二个条件.

我只是无法理解它:(

Con*_*rix 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') /
Run Code Online (Sandbox Code Playgroud)

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

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

演示

另一种选择是使用De Morgan定律进行以下操作:"否定分离是否定的结合".

SELECT * 
FROM   table_a a 
WHERE  a.a_order = 'car' 
    AND NOT ( a.color = 'red' 
             AND a.automatic = 'auto' ) 
Run Code Online (Sandbox Code Playgroud)

演示