sql多条件一起不正确

时间:2013-11-21 10:00:10

标签: sql

我的问题很简单,但我无法理解

我的陈述:

SELECT * 
FROM table 1 
WHERE (row1 = 0 AND row2 > 0) 
   OR (row3 is NULL AND row4 > 0)

这为我提供了一个对一个选项正确的行选择。

我想要的是选择where子句总共不为真的所有行

SELECT * 
FROM  table 1
WHERE NOT((row1 = 0 AND row2 > 0) 
           OR (row3 is NULL AND row4 > 0))

出了什么问题

SELECT * 
FROM table 1 
WHERE (row1 > 0 AND row2 = 0) 
   OR (row3 is NOT NULL AND row4 = 0)

3 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西?我假设你的意思是字段而不是行...

SELECT *
FROM table1
WHERE not exists

(select *
from table1
 where
 ((field1 = 0 and field2 > 0) OR (field3 IS NULL AND field4 > 0)))

可能会看到这一点,以获取有关NOT IN和NOT EXISTS的更多信息,以根据您的子查询规范排除结果:

NOT IN vs NOT EXISTS

答案 1 :(得分:0)

我怀疑你的问题与列中的NULL值有关,因为任何带NULL的谓词都会计算为NULL,所以既不是true也不是false:

想象一个简单的表T,其中包含一列(Col):

Col
-----
1
2
3
NULL

所以如果我们跑:

SELECT  Col
FROM    T
WHERE   Col = 1;

我们得到一行,其中Col = 1,因此在逻辑上运行:

SELECT  Col
FROM    T
WHERE   NOT (Col = 1);

或者

SELECT  Col
FROM    T
WHERE   Col <> 1

你会期望剩余的3行,但在这两种情况下你都只会得到:

Col
----
2
3

这是因为NOT(NULL = 1)NULL <> 1都是NULL,所以不是这样,所以不会返回第4行。

获得结果的方法是使用EXCEPT

SELECT  Col
FROM    T
EXCEPT
SELECT  Col
FROM    T
WHERE   Col = 1

<强> Examples on SQL Fiddle

答案 2 :(得分:0)

如果你想考虑NULL,试试这个:

select * from table1 
where Not((row1 = 0 and row2 > 0) or  (row3 is null and row4 > 0))
or (row1 is null or row2 is null) and row4 is null