我的问题很简单,但我无法理解
我的陈述:
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)
答案 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的更多信息,以根据您的子查询规范排除结果:
答案 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