跳转到主要内容
WHERE 子句允许你过滤 SELECTFROM 子句返回的数据。 如果存在 WHERE 子句,其后必须跟一个 UInt8 类型的表达式。 表达式求值结果为 0 的行会被排除,不再参与后续转换或最终结果。 WHERE 子句后的表达式通常会结合比较运算符逻辑运算符使用,或者使用众多常规函数中的一种。 如果底层表引擎支持,系统在计算 WHERE 表达式时会利用索引和分区裁剪能力。
PREWHERE还有一种名为 PREWHERE 的过滤优化。 Prewhere 是一种能更高效执行过滤的优化机制。 即使未显式指定 PREWHERE 子句,它默认也是启用的。

判断 NULL

如果你需要判断某个值是否为 NULL,请使用: 否则,包含 NULL 的表达式将永远不会成立。

使用逻辑运算符过滤数据

您可以将以下逻辑函数WHERE 子句配合使用,以组合多个条件:

将 UInt8 列用作条件

在 ClickHouse 中,UInt8 列可直接用作布尔条件,其中 0 表示 false,任何非零值 (通常为 1) 都表示 true。 相关示例见下文

使用比较运算符

可以使用以下比较运算符
运算符函数描述示例
a = bequals(a, b)等于price = 100
a == bequals(a, b)等于 (替代语法)price == 100
a != bnotEquals(a, b)不等于category != 'Electronics'
a <> bnotEquals(a, b)不等于 (替代语法)category <> 'Electronics'
a < bless(a, b)小于price < 200
a <= blessOrEquals(a, b)小于或等于price <= 200
a > bgreater(a, b)大于price > 500
a >= bgreaterOrEquals(a, b)大于或等于price >= 500
a LIKE slike(a, b)模式匹配 (区分大小写)name LIKE '%top%'
a NOT LIKE snotLike(a, b)模式不匹配 (区分大小写)name NOT LIKE '%top%'
a ILIKE silike(a, b)模式匹配 (不区分大小写)name ILIKE '%LAPTOP%'
a BETWEEN b AND ca >= b AND a <= c范围检查 (包含边界)price BETWEEN 100 AND 500
a NOT BETWEEN b AND ca < b OR a > c范围外检查price NOT BETWEEN 100 AND 500

模式匹配和条件表达式

除了比较运算符外,你还可以在 WHERE 子句中使用模式匹配和条件表达式。
FeatureSyntaxCase-SensitivePerformanceBest For
LIKEcol LIKE '%pattern%'YesFast区分大小写的精确模式匹配
ILIKEcol ILIKE '%pattern%'NoSlower不区分大小写的搜索
if()if(cond, a, b)N/AFast简单条件判断
multiIf()multiIf(c1, r1, c2, r2, def)N/AFast多条件判断
CASECASE WHEN ... THEN ... ENDN/AFast符合 SQL 标准的条件逻辑
用法示例请参见“模式匹配和条件表达式”

包含字面量、列或子查询的表达式

WHERE 子句后面的表达式也可以包含字面量、列或子查询。子查询是嵌套的 SELECT 语句,会返回在条件中使用的值。
类型定义求值时机性能示例
Literal固定常量值编写查询时最快WHERE price > 100
Column表数据引用按行求值WHERE price > cost
Subquery嵌套的 SELECT查询执行时视情况而定WHERE id IN (SELECT ...)
你可以在复杂条件中混合使用字面量、列和子查询:

示例

判断 NULL

带有 NULL 值的查询:

使用逻辑运算符过滤数据

给定如下表和数据:
1. AND - 两个条件都必须成立:
2. OR - 至少有一个条件必须成立:
3. NOT - 对条件取反:
4. XOR - 必须恰好只有一个条件为真 (不能同时都为真) :
5. 结合多个运算符:
6. 使用函数语法:
SQL 关键字语法 (ANDORNOTXOR) 通常更易于阅读,但在复杂表达式中或构建动态查询时,函数语法也很有用。

将 UInt8 列用作条件

沿用前一个示例中的表,你可以直接将列名作为条件使用:

使用比较运算符

以下示例使用上方示例中的表和数据。为简洁起见,结果已省略。 1. 显式等于 true (= 1= true) :
2. 显式地与 false 相等 (= 0= false) :
3. 不等于 (!= 0!= false) :
4. 大于:
5. 小于等于:
6. 与其他条件结合使用:
7. 使用 IN 运算符: 在下面的示例中,(1, true) 是一个元组
你也可以使用 数组 来实现这一点:
8. 混用比较写法:

模式匹配和条件表达式

下面的示例使用了上面示例中的表和数据。为简洁起见,结果已省略。

LIKE 示例

ILIKE 示例

IF 示例

multiIf 示例

CASE 示例

简单的 CASE:
搜索型 CASE:
最后修改于 2026年7月2日