跳到主要内容
跳到主要内容

EXCEPT 子句

EXCEPT 子句仅返回第一个查询的结果中不包含第二个查询的行。

  • 两个查询必须具有相同数量的列,并且列的顺序和数据类型必须相同。
  • EXCEPT 的结果可以包含重复的行。如果不希望出现重复行,请使用 EXCEPT DISTINCT
  • 如果没有指定括号,多个 EXCEPT 语句将从左到右依次执行。
  • EXCEPT 操作符与 UNION 子句的优先级相同,低于 INTERSECT 子句的优先级。

语法

条件可以是根据您的要求的任何表达式。

此外,可以使用 EXCEPT() 来排除结果中的某些列,语法与 BigQuery (Google Cloud) 中的用法相同,如下所示:

示例

本节的示例演示了 EXCEPT 子句的用法。

使用 EXCEPT 子句过滤数字

这是一个简单的示例,它返回数字 1 到 10 中不包括数字 3 到 8 的结果:

查询:

结果:

使用 EXCEPT() 排除特定列

EXCEPT() 可以快速排除结果中的列。例如,如果我们想选择表中的所有列,但排除一些特定的列,如下例所示:

查询:

结果:

使用 EXCEPTINTERSECT 处理加密货币数据

EXCEPTINTERSECT 在不同的布尔逻辑中通常可以互换使用,它们都在两个共享一个或多个公共列的表中非常有用。 例如,假设我们有几百万行的历史加密货币数据,其中包含交易价格和交易量:

查询:

结果:

现在假设我们有一个名为 holdings 的表,包含我们拥有的加密货币列表,以及每种货币的数量:

我们可以使用 EXCEPT 来回答这样的问题 “我们拥有的哪些币的交易价格从未低于 $10?”

结果:

这意味着在我们拥有的四种加密货币中,只有比特币从未跌破 $10(基于我们在此示例中的有限数据)。

使用 EXCEPT DISTINCT

注意在之前的查询中,我们在结果中有多个比特币的持有记录。您可以在 EXCEPT 后添加 DISTINCT 以消除结果中的重复行:

结果:

另请参见