EXCEPT 子句
EXCEPT
子句仅返回第一个查询的结果中不包含第二个查询的行。
- 两个查询必须具有相同数量的列,并且列的顺序和数据类型必须相同。
EXCEPT
的结果可以包含重复的行。如果不希望出现重复行,请使用EXCEPT DISTINCT
。- 如果没有指定括号,多个
EXCEPT
语句将从左到右依次执行。 EXCEPT
操作符与UNION
子句的优先级相同,低于INTERSECT
子句的优先级。
语法
条件可以是根据您的要求的任何表达式。
此外,可以使用 EXCEPT()
来排除结果中的某些列,语法与 BigQuery (Google Cloud) 中的用法相同,如下所示:
示例
本节的示例演示了 EXCEPT
子句的用法。
使用 EXCEPT
子句过滤数字
这是一个简单的示例,它返回数字 1 到 10 中不包括数字 3 到 8 的结果:
查询:
结果:
使用 EXCEPT()
排除特定列
EXCEPT()
可以快速排除结果中的列。例如,如果我们想选择表中的所有列,但排除一些特定的列,如下例所示:
查询:
结果:
使用 EXCEPT
和 INTERSECT
处理加密货币数据
EXCEPT
和 INTERSECT
在不同的布尔逻辑中通常可以互换使用,它们都在两个共享一个或多个公共列的表中非常有用。
例如,假设我们有几百万行的历史加密货币数据,其中包含交易价格和交易量:
查询:
结果:
现在假设我们有一个名为 holdings
的表,包含我们拥有的加密货币列表,以及每种货币的数量:
我们可以使用 EXCEPT
来回答这样的问题 “我们拥有的哪些币的交易价格从未低于 $10?”:
结果:
这意味着在我们拥有的四种加密货币中,只有比特币从未跌破 $10(基于我们在此示例中的有限数据)。
使用 EXCEPT DISTINCT
注意在之前的查询中,我们在结果中有多个比特币的持有记录。您可以在 EXCEPT
后添加 DISTINCT
以消除结果中的重复行:
结果:
另请参见