操作符
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。
比较操作符
等于函数
a = b
– 这个对应的函数是 equals(a, b)
。
a == b
– 这个对应的函数是 equals(a, b)
。
不等于函数
a != b
– 这个对应的函数是 notEquals(a, b)
。
a <> b
– 这个对应的函数是 notEquals(a, b)
。
小于或等于函数
a <= b
– 这个对应的函数是 lessOrEquals(a, b)
。
大于或等于函数
a >= b
– 这个对应的函数是 greaterOrEquals(a, b)
。
小于函数
a < b
– 这个对应的函数是 less(a, b)
。
大于函数
a > b
– 这个对应的函数是 greater(a, b)
。
LIKE 函数
a LIKE s
– 这个对应的函数是 like(a, b)
。
NOT LIKE 函数
a NOT LIKE s
– 这个对应的函数是 notLike(a, b)
。
ILIKE 函数
a ILIKE s
– 这个对应的函数是 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
相同。
数据集操作的操作符
IN 函数
a IN ...
– 这个对应的函数是 in(a, b)
。
NOT IN 函数
a NOT IN ...
– 这个对应的函数是 notIn(a, b)
。
GLOBAL IN 函数
a GLOBAL IN ...
– 这个对应的函数是 globalIn(a, b)
。
GLOBAL NOT IN 函数
a GLOBAL NOT IN ...
– 这个对应的函数是 globalNotIn(a, b)
。
IN 子查询函数
a = ANY (subquery)
– 这个对应的函数是 in(a, subquery)
。
NOT IN 子查询函数
a != ANY (subquery)
– 与 a NOT IN (SELECT singleValueOrNull(*) FROM subquery)
相同。
IN 子查询函数
a = ALL (subquery)
– 与 a IN (SELECT singleValueOrNull(*) FROM subquery)
相同。
NOT IN 子查询函数
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
类型的值。
您可以在 tests 中查看更多示例。
INTERVAL
创建一个 Interval 类型的值,该值应在与 Date 和 DateTime 类型的值进行算术运算时使用。
间隔类型:
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
在设置 INTERVAL
值时,您还可以使用字符串文字。例如,INTERVAL 1 HOUR
与 INTERVAL '1 hour'
或 INTERVAL '1' hour
是相同的。
不同类型的间隔不能结合。您不能使用像 INTERVAL 4 DAY 1 HOUR
这样的表达式。请在单位小于或等于间隔的最小单位时指定间隔,例如 INTERVAL 25 HOUR
。您可以执行连续操作,如下面的示例所示。
示例:
总是推荐使用 INTERVAL
语法或 addDays
函数。简单的加法或减法(例如 now() + ...
)不考虑时间设置,例如夏令时。
示例:
另请参见
- Interval 数据类型
- toInterval 类型转换函数
逻辑 AND 操作符
语法 SELECT a AND b
— 计算 a
和 b
的逻辑与,使用函数 and。
逻辑 OR 操作符
语法 SELECT a OR b
— 计算 a
和 b
的逻辑或,使用函数 or。
逻辑取反操作符
语法 SELECT NOT a
— 计算 a
的逻辑取反,使用函数 not。
条件操作符
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
- 对于 Nullable 类型的值,
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
- 对于 Nullable 类型的值,
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
。