簡體   English   中英

SQL WHERE 子句從多個列中過濾

[英]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。

我想要做的就是排除:

  • QuestionNum 5 和 Survey 1
  • QuestionNum 6 和 Survey 2

這是我的 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
)

db<>fiddle 上的演示

我總是在解釋 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM