ClickHouse官方文档翻译_SQL参考_运算符

Posted by Lance Lee on Friday, November 20, 2020

TOC

运算符

ClickHouse在查询解析阶段会根据优先权、优先级以及关联性转换操作符为相应的函数。

访问运算符

  • a[N] – 访问数组元素。arrayElement(a, N)函数。
  • a.N – 访问元组元素。tupleElement(a, N)函数。

数字非运算符

  • -anegate (a)函数。

乘法除法运算符

  • a * bmultiply (a, b) 函数。
  • a / bdivide(a, b) 函数。
  • a % bmodulo(a, b) 函数。

加法减法运算符

  • a + bplus(a, b) 函数。
  • a - bminus(a, b) 函数。

比较运算符

  • a = bequals(a, b) 函数。
  • a == bequals(a, b) 函数。
  • a != bnotEquals(a, b) 函数。
  • a <> bnotEquals(a, b) 函数。
  • a <= blessOrEquals(a, b) 函数。
  • a >= bgreaterOrEquals(a, b) 函数。
  • a < bless(a, b) 函数。
  • a > bgreater(a, b) 函数。
  • a LIKE slike(a, b) 函数。
  • a NOT LIKE snotLike(a, b) 函数。
  • a ILIKE silike(a, b) 函数。
  • a BETWEEN b AND c – 与a >= b AND a <= c相同。
  • a NOT BETWEEN b AND c – 与The same as a < b OR a > c相同。

数据集处理运算符

参考IN operators

  • a IN ...in(a, b) 函数。
  • a NOT IN ...notIn(a, b) 函数。
  • a GLOBAL IN ...globalIn(a, b) 函数。
  • a GLOBAL NOT IN ...globalNotIn(a, b) 函数。

日期和时间处理运算符

抽取

EXTRACT(part FROM date);

从给定的日期中提起部分。例如,可以从给定日期检索月份,或从时间检索秒。

part参数指明了从日期中检索的部分。可用下面的值:

  • DAY — 月中的那一天。可能的值:1–31。
  • MONTH — 月份。可能的值:1–12。
  • YEAR — 年。
  • SECOND — 秒。可能的值:0–59。
  • MINUTE — 分钟。可能的值:0–59。
  • HOUR — 小时。可能的值:0–23。

part参数不区分大小写。

date参数指定要处理的日期或时间。日期或日期时间类型都受支持。

例如:

SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));

下面的例子中我们创建一个表,然后插入一行包括DateTime类型的值。

CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
)
ENGINE = Log;
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘

可以在测试章节看到更多例子。

间隔

创建一个间隔类型值需要使用算术运算符以及DateDateTime类型值。

间隔的类型:

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

还可以在设置INTERVAL 值时使用字符串文字。例如,INTERVAL 1 HOURINTERVAL '1 hour'INTERVAL '1' hour完全相同。

Warning:不同类型的间隔不能组合。不能使用类似于INTERVAL 4 DAY 1 HOUR的表达式。指定间隔的单位要小于或等于间隔的最小单位,例如,INTERVAL 25 HOUR。可以使用连续操作符,如下面的示例所示。

例如:

SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘
参考
  • Interval 数据类型
  • toInterval 类型转换函数

逻辑非运算符

  • NOT anot(a) 函数。

逻辑与运算符

  • a AND band(a, b) 函数。

逻辑或运算符

  • a OR bor(a, b) 函数。

条件运算符

  • a ? b : cif(a, b, c) 函数。

注意:条件运算符计算bc的值,然后检查条件a是否满足,然后返回相应的值。如果bCarrayJoin()函数,那么无论“a”条件如何,每一行都将被复制。

条件表达式

CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END

如果指定x,则会使用transform(x, [a, ...], [b, ...], c)函数。否则multiIf(a, b, ..., c)

如果表达式中没有ELSE c子句,则默认值为NULL

对于NULLtransform 函数不起作用。

连接运算符

  • s1 || s2concat(s1, s2) 函数。

Lambda 建立运算符

  • x -> exprlambda(x, expr) 函数。

以下操作符没有优先级,因为它们是方括号:

数组创建运算符

  • [x1, ...]array(x1, ...) 函数。

元组创建运算符

  • (x1, x2, ...)tuple(x2, x2, ...) 函数。

结合律

所有的二元运算符都保留了结合性。例如,1 + 2 + 3 会转换为plus(plus(1, 2), 3)。有时这并不会像你期望的那样工作。例如,SELECT 4 > 2 > 3将得到0。

为了提高效率,andor函数接受任意数量的参数。相应的ANDOR操作符链被转换为这些函数的单个调用。

检查NULL

ClickHouse 支持 IS NULLIS NOT NULL运算符。

IS NULL

  • 对于 Nullable类型的值,IS NULL运算符返回:
    • 1,如果值为NULL。
    • 其他0
  • 对于其他值,IS NULL运算符总是返回0
SELECT x+100 FROM t_null WHERE y IS NULL
┌─plus(x, 100)─┐
│          101 │
└──────────────┘

IS NOT NULL

  • 对于 Nullable类型的值,IS NOT NULL运算符返回:
    • 0,如果值为NULL。
    • 其他1
  • 对于其他值,IS NOT NULL运算符总是返回1
SELECT * FROM t_null WHERE y IS NOT NULL
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘

「如果这篇文章对你有用,请支持一下哦」

Attack On Programmer

如果这篇文章对你有用,请支持一下哦

使用微信扫描二维码完成支付