[英]SQL WHERE clause filter from more than one column
我有一張桌子:
RowID QuestionNum Survey
--------------------------------
ABC 1 1
DEF 2 1
ASD 3 1
RDS 4 1
TGH 5 1
YHG 1 2
TGF 2 2
UHJ 3 2
UJH 4 2
IJK 5 2
UJH 6 2
RowID 是字符串,QuestionNum 和 Survey 是 INT。
我想要做的就是排除:
這是我的 SQL:
SELECT RowID, QuestionNum, SurveyType
FROM dbo.tblTest
WHERE (SurveyType <> 1)
AND (QuestionNum <> 5)
OR (SurveyType <> 2) AND (QuestionNum <> 6)
但它返回所有行 - 我錯過了什么?
謝謝。
我想要做的就是排除 QuestionNum 1 和 Survey 1 AND QuestionNum 6 和 Survey 2
您可以將此條件表述為:
WHERE NOT (
(SurveyType = 1 AND QuestionNum = 5)
OR (SurveyType = 2 AND QuestionNum = 6)
)
如果對列表太大,您可以使用基於集合的方法:
SELECT RowID, QuestionNum, Survey
FROM t
WHERE NOT EXISTS (
SELECT 1
FROM (VALUES
(1, 1),
(6, 2)
-- add moar pairs
) AS e(QuestionNum, Survey)
WHERE t.QuestionNum = e.QuestionNum AND t.Survey = e.Survey
)
我總是在解釋 SQL 上的NOT(...)
條件時遇到問題,所以我采取積極的方式:
SELECT
RowID,
QuestionNum,
SurveyType
FROM
dbo.tblTest
WHERE
(
QuestionNum <> 1 OR -- Either question number isn't 1
(QuestionNum = 1 AND SurveyType <> 1) -- ... or if it is 1, then survey type mustn't be 1
)
AND
(
QuestionNum <> 6 OR -- Either question number isn't 6
(QuestionNum = 6 AND SurveyType <> 2) -- ... or if it is 6, then survey type musn't be 2
)
必須注意NULL
值,如果它們在您的列上是可能的。 如果您有一堆要排除的行,請閱讀 Salman 的解決方案。
在將您的要求轉換為 Query 時,這是運算符優先級的問題,排除:
QuestionNum 1 and Survey 1
QuestionNum 6 and Survey 2
:以下在您的情況下應該可以正常工作:
SELECT RowID, QuestionNum, SurveyType
FROM dbo.tblTest
WHERE (SurveyType <> 1 AND QuestionNum <> 1)
OR (SurveyType <> 2 AND QuestionNum <> 6)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.