2013-11-21 6 views
1

Мой вопрос очень простой, но я не могу получить мою голову вокругSQL несколько условий вместе не так

мое заявление:

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

Это дает мне выбор строк, который является правильным для одного варианта.

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

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) 
+1

Пример данные и ожидаемый результат. –

+1

вы действительно cryptic – lordkain

+0

Извините, если я загадочен в основном, я хочу, чтобы все строки из моей таблицы были исключены из (row1 = 0 и row2> 0) или (row3 is null и row4> 0) Условие – user3016918

ответ

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

+0

Это то, что я искал, спасибо SelectDistinct – user3016918

0

Я подозреваю, ваша проблема связана с NULL значений в столбцах, потому что любой предикат NULL принимает значение NULL, поэтому не является ни истинным или ложным:

Представьте простую таблицу T Wi го один столбец (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, так что не так, так что четвёртая строка не возвращается.

Путь, чтобы получить результат вы после использования EXCEPT

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

Examples on SQL Fiddle

0

Если вы хотите принять NULLs во внимание, попробуйте следующее:

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 
Смежные вопросы