我遇到了一個帶有很多這樣的 WHERE 陳述句的 postgresql 查詢
WHERE (category <> 'A' OR category IS NULL)
AND (category <> 'B' OR category IS NULL)
我正在努力了解此查詢包含/排除哪些資料。
我嘗試將上面的代碼重寫為
WHERE category NOT IN ('A','B')WHERE category NOT IN ('A', 'B') OR category IS NULLWHERE (category NOT IN ('A', 'B') OR category IS NULL)
這三個人都對原始代碼給出了不同的答案。
有人可以向我解釋上述四種情況中包含/排除的資料嗎?
比如說資料看起來像
| ID | 類別 |
|---|---|
| 1 | 一種 |
| 2 | 乙 |
| 3 | C |
| 4 | D |
| 5 | 空值 |
對于 (1) 我只會得到 ID 3、4。但我不確定其他人。
編輯:WHERE (category NOT IN ('A', 'B') OR category IS NULL)和
WHERE (category <> 'A' OR category IS NULL)
AND (category <> 'B' OR category IS NULL)
給出同樣的答案。
但是WHERE category NOT IN ('A', 'B') OR category IS NULL沒有括號給出了不同的答案。
uj5u.com熱心網友回復:
要正確理解上述查詢的輸出,您必須按以下方式思考:一一獲取滿足 WHERE 子句的所有行。
查詢 1
WHERE category NOT IN ('A','B')
查詢 1 應該給出屬性category不在指定集中的所有行。如果您一步一步進行,一次一行您可以看到:
- 前 2 行不包含在輸出中,因為該
category列包含集合中的值('A','B') - 接下來的 2 行包含在輸出中,因為該
category列不包含集合中的值('A','B') - 最后一行不包含在輸出中,因為根據三值邏輯將 NULL 值評估為 UNKNOWN
為了更好地理解最后一點,該子句WHERE category NOT IN ('A','B')可以重寫為WHERE category<>'A' AND category<>'B'。由于category為 NULL,邏輯運算式按以下方式計算WHERE NULL<>'A' AND NULL<>'B',其輸出為 UNKNOWN,因此該行將不包含在輸出結果中。
查詢 2 和 3
WHERE category NOT IN ('A', 'B') OR category IS NULL
查詢 2 和 3 是相同的,因為在這種情況下括號不會影響邏輯運算子的計算順序。
在這種特殊情況下,上面示例表的最后一行包含在輸出中,因為category NOT IN ('A','B')被評估為 UNKNOWN 并被category IS NULL評估為 TRUE。出于與上述相同的原因(三值邏輯),結果UNKNOWN or TRUE為 TRUE。
uj5u.com熱心網友回復:
我認為您在查詢的邏輯上很掙扎,第一個很容易理解
where category not in ('A','B')
你會得到 id : 3,4,5
請注意,使用類別的 id 比使用字母更好。
在第二個查詢中
where category not in ('A','B') or category is null
兩個條件都為真并且都將完成
您將獲得以下 ID:3,4
第三個它必須為您提供與 (2) 條件相同的輸出
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451176.html
標籤:PostgreSQL where子句 在哪里
