运算符
ClickHouse 在查询解析阶段会根据运算符的优先级、前置性和结合性将其转换为相应的函数。
访问运算符
a[N] – 访问数组的元素。 arrayElement(a, N) 函数。
a.N – 访问元组的元素。 tupleElement(a, N) 函数。
数值否定运算符
-a – negate(a) 函数。
对于元组否定: tupleNegate。
乘法和除法运算符
a * b – multiply(a, b) 函数。
对于元组乘以数字: tupleMultiplyByNumber,对于点积: dotProduct。
a / b – divide(a, b) 函数。
对于元组除以数字: tupleDivideByNumber。
a % b – modulo(a, b) 函数。
加法和减法运算符
a + b – plus(a, b) 函数。
对于元组加法: tuplePlus。
a - b – minus(a, b) 函数。
对于元组减法: tupleMinus。
比较运算符
equals 函数
a = b – equals(a, b) 函数。
a == b – equals(a, b) 函数。
notEquals 函数
a != b – notEquals(a, b) 函数。
a <> b – notEquals(a, b) 函数。
lessOrEquals 函数
a <= b – lessOrEquals(a, b) 函数。
greaterOrEquals 函数
a >= b – greaterOrEquals(a, b) 函数。
less 函数
a < b – less(a, b) 函数。
greater 函数
a > b – greater(a, b) 函数。
like 函数
a LIKE b – like(a, b) 函数。
notLike 函数
a NOT LIKE b – notLike(a, b) 函数。
ilike 函数
a ILIKE b – ilike(a, b) 函数。
BETWEEN 函数
a BETWEEN b AND c – 与 a >= b AND a <= c 相同。
a NOT BETWEEN b AND c – 与 a < b OR a > c 相同。
不区分的运算符 (<=>)
从 25.10 版本开始,你可以像使用任何其他运算符一样使用 <=>。 在 25.10 之前,它只能在 JOIN 表达式中使用,例如
<=> 运算符是 NULL 安全的相等运算符,等效于 IS NOT DISTINCT FROM。 它像常规的相等运算符 (=) 一样工作,但它将 NULL 值视为可比较。 两个 NULL 值被认为是相等的,并且 NULL 与任何非 NULL 值进行比较返回 0 (false) 而不是 NULL。
用于处理数据集的运算符
in 函数
a IN ... – in(a, b) 函数。
notIn 函数
a NOT IN ... – notIn(a, b) 函数。
globalIn 函数
a GLOBAL IN ... – globalIn(a, b) 函数。
globalNotIn 函数
a GLOBAL NOT IN ... – globalNotIn(a, b) 函数。
in 子查询函数
a = ANY (subquery) – in(a, subquery) 函数。
notIn 子查询函数
a != ANY (subquery) – 与 a NOT IN (SELECT singleValueOrNull(*) FROM subquery) 相同。
in 子查询函数
a = ALL (subquery) – 与 a IN (SELECT singleValueOrNull(*) FROM subquery) 相同。
notIn 子查询函数
a != ALL (subquery) – notIn(a, subquery) 函数。
示例
包含 ALL 的查询
结果
包含 ANY 的查询
结果
用于处理日期和时间的运算符
EXTRACT
从给定的日期中提取部分。 例如,你可以从给定的日期中检索月份,或从时间中检索秒。
part 参数指定要检索的日期的哪个部分。 可用的值如下:
DAY— 月份中的天数。 可能的值:1–31。MONTH— 月份的编号。 可能的值:1–12。YEAR— 年份。SECOND— 秒。 可能的值:0–59。MINUTE— 分钟。 可能的值:0–59。HOUR— 小时。 可能的值:0–23。
part 参数不区分大小写。
date 参数指定要处理的日期或时间。 支持 Date 或 DateTime 类型。
示例
在下面的示例中,我们创建一个表并向其中插入一个具有 DateTime 类型的值。
你可以在 测试 中查看更多示例。
INTERVAL
创建一个 Interval 类型的值,该值应在与 Date 和 DateTime 类型值进行算术运算时使用。
间隔类型
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
你也可以在设置 INTERVAL 值时使用字符串字面量。 例如,INTERVAL 1 HOUR 与 INTERVAL '1 hour' 或 INTERVAL '1' hour 相同。
不能组合不同类型的间隔。 你不能使用诸如 INTERVAL 4 DAY 1 HOUR 之类的表达式。 指定小于或等于间隔中最小单位的单位的间隔,例如 INTERVAL 25 HOUR。 你可以使用连续操作,如下例所示。
示例
始终首选 INTERVAL 语法或 addDays 函数。 简单的加法或减法(例如 now() + ...)不考虑时间设置。 例如,夏令时。
示例
参见
- Interval 数据类型
- toInterval 类型转换函数
逻辑与运算符
语法 SELECT a AND b — 使用函数 and 计算 a 和 b 的逻辑合取。
逻辑或运算符
语法 SELECT a OR b — 使用函数 or 计算 a 和 b 的逻辑析取。
逻辑非运算符
语法 SELECT NOT a — 使用函数 not 计算 a 的逻辑否定。
条件运算符
a ? b : c – if(a, b, c) 函数。
注意
条件运算符计算 b 和 c 的值,然后检查条件 a 是否满足,然后返回相应的值。 如果 b 或 c 是 arrayJoin() 函数,则无论 "a" 条件如何,每一行都将被复制。
条件表达式
如果指定了 x,则使用 transform(x, [a, ...], [b, ...], c) 函数。 否则 – multiIf(a, b, ..., c)。
如果在表达式中没有 ELSE c 子句,则默认值为 NULL。
transform 函数不适用于 NULL。
连接运算符
s1 || s2 – concat(s1, s2) 函数。
Lambda 创建运算符
x -> expr – lambda(x, expr) 函数。
以下运算符没有优先级,因为它们是括号
数组创建运算符
[x1, ...] – array(x1, ...) 函数。
元组创建运算符
(x1, x2, ...) – tuple(x2, x2, ...) 函数。
结合性
所有二元运算符都具有左结合性。例如,1 + 2 + 3 会转换为 plus(plus(1, 2), 3)。有时这可能不会按你期望的方式工作。例如,SELECT 4 > 2 > 3 的结果将是 0。
为了提高效率,and 和 or 函数可以接受任意数量的参数。相应的 AND 和 OR 运算符链会被转换为对这些函数的单个调用。
检查 NULL
ClickHouse 支持 IS NULL 和 IS NOT NULL 运算符。
IS NULL
- 对于 可为空 类型的值,
IS NULL运算符返回1,如果该值为NULL。0,否则。
- 对于其他值,
IS NULL运算符始终返回0。
可以通过启用 optimize_functions_to_subcolumns 设置进行优化。当 optimize_functions_to_subcolumns = 1 时,该函数仅读取 null 子列,而不是读取和处理整个列数据。查询 SELECT n IS NULL FROM table 转换为 SELECT n.null FROM TABLE。
IS NOT NULL
- 对于 可为空 类型的值,
IS NOT NULL运算符返回0,如果该值为NULL。1,否则。
- 对于其他值,
IS NOT NULL运算符始终返回1。
可以通过启用 optimize_functions_to_subcolumns 设置进行优化。当 optimize_functions_to_subcolumns = 1 时,该函数仅读取 null 子列,而不是读取和处理整个列数据。查询 SELECT n IS NOT NULL FROM table 转换为 SELECT NOT n.null FROM TABLE。