排除SQL查询的结果 - 按区域或人口大,但不是两者

Kev*_*cky 2 sql where-clause

我在本教程的 Q.8上遇到了问题,这是Q.7的后续内容:

问题#7

两种大的方法:如果一个国家面积超过300万平方公里,或者人口超过2.5亿,那么这个国家就很大.

按人口显示面积大或面积大的国家.显示名称,人口和面积.

问题#8

美国和中国人口众多,面积大.排除这些国家/地区.

按人口而不是两者显示面积大面积大的国家.显示名称,人口和面积.

我获得一些成功的代码是:

SELECT name, population, area
FROM world 
WHERE area > 3000000 
OR population > 250000000
AND NOT EXISTS (
    SELECT name, population, area 
    FROM world 
    WHERE name='USA' 
    OR 'China'
)
Run Code Online (Sandbox Code Playgroud)

但是'中国'和'美国'仍出现在我的结果中!有人可以告诉我如何写一个WHERE子句来删除它们吗?

Stu*_*tLC 6

(注意这是OP的问题8 - 问题7就是OR)

需要条件A或条件B但不同时满足两者的逻辑运算是Exclusive Or,并且缩写为XOR

这是Ansi Sql支持的,因此可以通过XOR在比较标准中使用来获得答案,如下所示:

  SELECT name, population, area
  FROM world
  WHERE (population > 250000000) XOR (area > 3000000);
Run Code Online (Sandbox Code Playgroud)

回复:更直观的替代方案

您可以扩展XOR为:

  WHERE ((population > 250000000) OR (area > 3000000)) 
       AND NOT ((population > 250000000) AND (area > 3000000))
Run Code Online (Sandbox Code Playgroud)

但是从一般意义上讲,不是重复确定一个国家是否big(按地区或人口)的逻辑,而是通过使用派生表更容易理解,这是人口和地区的原因,然后派生列可以是在外部查询中的过滤器逻辑中重用:

SELECT name, population, area
FROM
(SELECT
     name, population, area,
     CASE WHEN population > 250000000 THEN 1 ELSE 0 END AS IsBigPop,
     CASE WHEN area > 3000000 THEN 1 ELSE 0 END AS IsBigArea
   FROM world
) DerivedWorld
WHERE (IsBigPop = 1 OR IsBigArea = 1) AND NOT (IsBigPop = 1 AND IsBigArea = 1);
Run Code Online (Sandbox Code Playgroud)

(当然你也可以缩写这个WHERE条款XOR)