SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”

Posted

技术标签:

【中文标题】SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”【英文标题】:SQL : How to use “and” and “or” in a “Where” clause with "NOT IN" conditions 【发布时间】:2017-06-07 13:16:30 【问题描述】:

我有一个查询应该让我返回特殊区域之外的所有用户。如果我有区域,结果还是一样的

SELECT users.id AS id, SUBSTRING(users.zipcode, 1, 2) 
FROM users JOIN country ON users.country_id = country.country_id 
WHERE country.country_code NOT IN ('AD','AF','BE')
OR (country.country_code = 'FR' AND SUBSTRING(users.zipcode, 1, 2)
NOT IN (69,38,26,07,42))

标识 |用户邮编 |国家代码

1 | 38 | FR

1 | 69 |是

我不希望所有用户使用 country_code 'AD'、'AF'、'BE' 但如果 country_code 是“FR”,我不希望只使用 user_zipcode 为 69、38、26、07、42 的用户

【问题讨论】:

你能提供样本数据和你想要的结果吗?这将有助于我们了解您想要做什么。 我认为 'FR' 需要包含在第一个 not in 中。因为它有特殊的附加条件需要考虑。如果邮政编码位于 (69,38,26,07,42) 中,您似乎希望所有用户不在 AD、AF、BE 和 FR 国家/地区。如果正确,则 FR 需要排在第一个 not in。还考虑 not in 不适用于 NULL 值。如果 国家:安道尔、阿富汗和比利时法国省:罗纳、伊泽尔、德罗姆、阿尔代什和卢瓦尔。请解释你想在这里发生什么。 【参考方案1】:

不包括安多拉、阿富汗、比利时和一些法国省份:

WHERE country.country_code NOT IN ('AD','AF','BE')
AND NOT (
    country.country_code = 'FR' AND
    SUBSTRING(users.zipcode, 1, 2) IN (69,38,26,07,42)
)

【讨论】:

以上是关于SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”的主要内容,如果未能解决你的问题,请参考以下文章

带有“not in”的 SQL 查询非常慢

SQL 中的 NOT IN 条件

SQL:如何在同一行显示 WHERE IN 和 WHERE NOT IN?

sql语句not in判断条件注意事项

oracle_not exists和not in的用法和区别

MySQL (NOT IN) 条件在超过一定数量的元素后无法正确返回