WHERE 子句允许你过滤 SELECT 的 FROM 子句返回的数据。
如果存在 WHERE 子句,其后必须跟一个 UInt8 类型的表达式。
表达式求值结果为 0 的行会被排除,不再参与后续转换或最终结果。
WHERE 子句后的表达式通常会结合比较运算符和逻辑运算符使用,或者使用众多常规函数中的一种。
如果底层表引擎支持,系统在计算 WHERE 表达式时会利用索引和分区裁剪能力。
PREWHERE还有一种名为
PREWHERE 的过滤优化。
Prewhere 是一种能更高效执行过滤的优化机制。
即使未显式指定 PREWHERE 子句,它默认也是启用的。判断 NULL
如果你需要判断某个值是否为 NULL,请使用:
否则,包含 NULL 的表达式将永远不会成立。
使用逻辑运算符过滤数据
您可以将以下逻辑函数与WHERE 子句配合使用,以组合多个条件:
将 UInt8 列用作条件
在 ClickHouse 中,UInt8 列可直接用作布尔条件,其中 0 表示 false,任何非零值 (通常为 1) 都表示 true。
相关示例见下文。
使用比较运算符
可以使用以下比较运算符:模式匹配和条件表达式
除了比较运算符外,你还可以在WHERE 子句中使用模式匹配和条件表达式。
用法示例请参见“模式匹配和条件表达式”。
包含字面量、列或子查询的表达式
WHERE 子句后面的表达式也可以包含字面量、列或子查询。子查询是嵌套的 SELECT 语句,会返回在条件中使用的值。
你可以在复杂条件中混合使用字面量、列和子查询:
示例
判断 NULL
带有 NULL 值的查询:
使用逻辑运算符过滤数据
给定如下表和数据:AND - 两个条件都必须成立:
OR - 至少有一个条件必须成立:
NOT - 对条件取反:
XOR - 必须恰好只有一个条件为真 (不能同时都为真) :
AND、OR、NOT、XOR) 通常更易于阅读,但在复杂表达式中或构建动态查询时,函数语法也很有用。
将 UInt8 列用作条件
沿用前一个示例中的表,你可以直接将列名作为条件使用:使用比较运算符
以下示例使用上方示例中的表和数据。为简洁起见,结果已省略。 1. 显式等于 true (= 1 或 = true) :
= 0 或 = false) :
!= 0 或 != false) :
IN 运算符:
在下面的示例中,(1, true) 是一个元组。
模式匹配和条件表达式
下面的示例使用了上面示例中的表和数据。为简洁起见,结果已省略。LIKE 示例
ILIKE 示例
SIMILAR TO 示例
与LIKE 不同,SIMILAR TO 模式还支持正则表达式元字符 |、*、+、?、{、}、(、)、[ 和 ];但与 LIKE 相同的是,它必须匹配整个值:
ESCAPE 子句指定自定义转义字符,该子句同样适用于 LIKE、ILIKE、NOT LIKE、NOT ILIKE 和 NOT SIMILAR TO:
SIMILAR TO 运算符文档。