2016-04-15 6 views
0

У меня есть эта таблицафильтр, где при условии

User  | SecretId | Status 
warheat1990 |  NULL | REV 
warheat1990 |  NULL | COM 
warheat1990 |  1 | REV 
warheat1990 |  1 | COM 

Я хочу, чтобы отфильтровать данные с (Status = REV и SecretId IS NOT NULL комбинированный), так что конечный результат будет

User  | SecretId | Status 
warheat1990 |  NULL | REV 
warheat1990 |  NULL | COM 
warheat1990 |  1 | COM 

Мои запрос

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' AND SecretId IS NULL) 

но он не работает, потому что он дает мне только эту ROW.

User  | SecretId | Status 
warheat1990 |  NULL | COM 

Так как исключить данные с Status = REV, но только если SecretId НЕ NULL

Я чувствую себя глупо, что я не могу понять этот простой случай. Любая помощь будет оценена по достоинству.

+0

В ожидаемого результата не должен быть последней строкой 'warheat1990 | 1 | REM'? – dotnetom

ответ

6

Я думаю, вы должны использовать или в SQL:

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' OR SecretId IS NULL) 

Вот математику знаний: вы хотите, чтобы соответствовать условию «нет (А и В)», то вы можете использовать эквивалентное выражение ((не A) или (не B)), поэтому вы должны использовать OR вместо AND.

3

Итак, вы хотите, чтобы вернуть данные, где Status <> 'REV'ИЛИSecretId IS NULL:

SELECT * 
FROM TABLE 
WHERE User = 'warheat1990' AND 
    (Status <> 'REV' OR SecretId IS NULL) 

При использовании AND вы получите только те строки, которые удовлетворяют обоим условиям. Когда вы используете OR, вы получаете строки, которые соответствуют хотя бы одному критерию.

2

Итак, вы хотите выбрать все, кроме (Status = REV и SecretId IS NOT NULL)?

Мы имеем: NOT (Status = REV и SecretId IS NOT NULL) < => (Status <> REV или SecretId IS NULL)

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' or SecretId IS NULL) 
Смежные вопросы