我在本教程的 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子句来删除它们吗?
(注意这是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)
| 归档时间: |
|
| 查看次数: |
10007 次 |
| 最近记录: |