参考
CnosDB 中的标识符、字面量和运算操作符的用法,以及一些SQL中常用的运算符。同时还介绍了运算符的优先级和一些其他相关内容。
标识符
用于命名数据库对象,例如 table
、column
名称。
引用
在 标识符 上使用双引号区分大小写,在字符串字面量上使用单引号。
不带引号的标识符在 CnosDB 中不区分大小写。
字面量
字面量是不由 标识符 标识的显式值。
字符串字面量
字符串字面量使用单引号括起来。
'station'
'temperature'
'H2o'
'avg temperature'
数字字面量
数字字面量是正数或负数,可以是精确数字或浮点数。
-- Integers
10
+10
-10
-- Unsigned integers
10::BIGINT UNSIGNED
+10::BIGINT UNSIGNED
-- Floats
10.78654
-100.56
日期和时间字面量
支持以下日期和时间字面量。
'2022-01-31T06:30:30.123Z' -- RFC3339
'2022-01-31T06:30:30.123' -- RFC3339-like
'2022-01-31 06:30:30.123' -- RFC3339-like
'2022-01-31 06:30:30' -- RFC3339-like, 没有小数点后的秒
1643610630123000000 -- 将 Unix epoch 纳秒转换为时间戳
Boolean 字面量
Boolean 字面量是 true
或 false
持续时间单位
间隔字面量指定长度或时间单位。
INTERVAL '6 minute'
INTERVAL '12 day 6 hour 30 minute'
支持以下时间单位:
- nanoseconds
- microseconds
- milliseconds
- second
- minute
- hour
- day
- week
- month
- year
- decade
- century
运算操作符
算数运算符
+
加法。
SELECT 1 + 2;
+---------------------+
| Int64(1) + Int64(2) |
+---------------------+
| 3 |
+---------------------+
-
减法。
SELECT 4 - 3;
+---------------------+
| Int64(4) - Int64(3) |
+---------------------+
| 1 |
+---------------------+
*
乘法。
SELECT 2 * 3;
+---------------------+
| Int64(2) * Int64(3) |
+---------------------+
| 6 |
+---------------------+
/
除法。
SELECT 8 / 4;
+---------------------+
| Int64(8) / Int64(4) |
+---------------------+
| 2 |
+---------------------+
%
取模。
SELECT 7 % 3;
+---------------------+
| Int64(7) % Int64(3) |
+---------------------+
| 1 |
+---------------------+
比较运算符
=
等于。
SELECT 1 = 1;
+---------------------+
| Int64(1) = Int64(1) |
+---------------------+
| true |
!=
不等于。
SELECT 1 != 2;
+----------------------+
| Int64(1) != Int64(2) |
+----------------------+
| true |
+----------------------+
<
小于。
SELECT 3 < 4;
+---------------------+
| Int64(3) < Int64(4) |
+---------------------+
| true |
+---------------------+
<=
小于或等于。
SELECT 3 <= 3;
+----------------------+
| Int64(3) <= Int64(3) |
+----------------------+
| true |
+----------------------+
>
大于。
SELECT 6 > 5;
+---------------------+
| Int64(6) > Int64(5) |
+---------------------+
| true |
+---------------------+
>=
大于或等于。
SELECT 5 >= 5;
+----------------------+
| Int64(5) >= Int64(5) |
+----------------------+
| true |
+----------------------+
IS DISTINCT FROM
保证比较结果是 true
或 false
并且不是空集。
SELECT 0 IS DISTINCT FROM NULL;
+--------------------------------+
| Int64(0) IS DISTINCT FROM NULL |
+--------------------------------+
| true |
+--------------------------------+
IS NOT DISTINCT FROM
IS DISTINCT FROM
的否定条件。
SELECT NULL IS NOT DISTINCT FROM NULL;
+--------------------------------+
| NULL IS NOT DISTINCT FROM NULL |
+--------------------------------+
| true |
+--------------------------------+
~
正则表达式匹配。
SELECT 'cnosdb' ~ '^cnosdb(-cli)*';
+-----------------------------------------+
| Utf8("cnosdb") ~ Utf8("^cnosdb(-cli)*") |
+-----------------------------------------+
| true |
+-----------------------------------------+
~*
正则表达式,不区分大小写匹配
SELECT 'cnosdb' ~* '^CNOSDB(-cli)*';
+------------------------------------------+
| Utf8("cnosdb") ~* Utf8("^CNOSDB(-cli)*") |
+------------------------------------------+
| true |
+------------------------------------------+
!~
与 ~ 相反。
SELECT 'cnosdb' !~ '^CNOSDB(-cli)*';
+------------------------------------------+
| Utf8("cnosdb") !~ Utf8("^CNOSDB(-cli)*") |
+------------------------------------------+
| true |
+------------------------------------------+
!~*
与 ~* 相反。
SELECT 'cnosdb' !~* '^CNOSDB(-cli)+';
+-------------------------------------------+
| Utf8("cnosdb") !~* Utf8("^CNOSDB(-cli)+") |
+-------------------------------------------+
| true |
+-------------------------------------------+
逻辑运算符
AND
SELECT true AND true;
+---------------------------------+
| Boolean(true) AND Boolean(true) |
+---------------------------------+
| true |
+---------------------------------+
OR
SELECT false OR true;
+---------------------------------+
| Boolean(false) OR Boolean(true) |
+---------------------------------+
| true |
+---------------------------------+
位运算符
&
按位与
SELECT 5 & 3;
+---------------------+
| Int64(5) & Int64(3) |
+---------------------+
| 1 |
+---------------------+
|
按位或
SELECT 5 | 3;
+---------------------+
| Int64(5) | Int64(3) |
+---------------------+
| 7 |
+---------------------+
其他运算符
||
字符串连接。
SELECT 'Hello, ' || 'CnosDB!';
+------------------------------------+
| Utf8("Hello, ") || Utf8("CnosDB!") |
+------------------------------------+
| Hello, CnosDB! |
+------------------------------------+
运算符优先级
如果一个复杂表达式有多个运算符,则运算符优先级将确定操作序列。 执行顺序可能对结果值有明显的影响。
运算符的优先级别如下表中所示。 在较低级别的运算符之前先对较高级别的运算符进行求值。 在下表中,1 代表最高级别,8 代表最低级别。
级别 | 运算符 |
---|---|
1 | *(乘)、/(除)、%(取模) |
2 | +(正)、-(负)、+(加)、+(串联)、-(减) |
3 | =、>=、<=、<>、!=、>、<(比较运算符) |
4 | NOT |
5 | AND |
6 | BETWEEN、IN、LIKE、OR |
保留字
表达式
表达式是符号和运算符的一种组合,CnosDB 处理该组合以获得单个数据值。 简单表达式可以是一个常量、变量、列或标量函数。 可以用运算符将两个或更多的简单表达式联接起来组成复杂表达式。
<expresion> :: = {
constant
| [ table_name. ] column
| scalar_function
| ( expression )
| expression { binary_operator } expression
| case_when_expression
| window_function | aggregate_function
}
常量
表示单个特定数据值的符号。详细内容请参考 字面量
标量函数
请参考 函数
单目运算符
运算符 | 描述 |
---|---|
NOT | 如果子表达式为 true ,则整个表达式 false ,如果整个表达式为 false ,则整个表达式为true 。 |
IS NULL | 如果子表达式为 null ,则整个表达式为 true 。 |
IS NOT NULL | 如果子表达式为 null ,则整个表达式为 false 。 |
二元运算符
二元运算符和两个表达式组合在一起,可以组成一个新的表达式。
支持的二元运算符有:
运算符 | 描述 |
---|---|
+ | 数字类型表达式相加。 |
- | 数字类型表达式相减。 |
* | 数字类型表达式相乘。 |
/ | 数字类型表达式相除。 |
% | 整数类型表达式取余。 |
|| | 字符串类型表达式拼接。 |
= | 比较表达式是否相等。 |
!= 、<> | 比较表达式是否不相等。 |
< | 比较表达式是否小于。 |
<= | 比较表达式是否小于等于。 |
> | 比较表达式是否大于。 |
>= | 比较表达式是否大于等于。 |
AND | 先求左表达式的值,如果为 true ,计算右表达式的值,都为 true 为true 。 |
OR | 先求左表达式的值,如果为 false ,计算右表达式的值,都为 false 为 false 。 |
LIKE | 判断左表达式是否符合右表达式的模式。 |
BETWEEN AND
等价于 WHERE >= expr AND WHERE <= expr
expr BETWEEN expr AND expr
返回 air
表中 perssure
字段在 50 - 60 之间的记录。
SELECT DISTINCT perssure FROM air WHERE perssure BETWEEN 50 AND 60;
IN
判断列表中是否有值与表达式相等。
IN
列表暂时只支持常量。
判断 air
表中 temperature
字段的值被 (68, 69)
包含。
SELECT station, temperature, visibility FROM air WHERE temperature IN (68, 69);
CASE WHEN
当表达式需要按照不同情况获取不同的值时,可以使用 CASE WHEN
表达式。
CASE
( WHEN expression THEN result1 [, ...] )
ELSE result
END;
查看示例。
SELECT DISTINCT
CASE WHEN PRESSURE >= 60 THEN 50
ELSE PRESSURE
END PRESSURE
FROM AIR;
注释
- 单行注释使用双连字符
--
符号。单行注释以换行符结尾。 - 多行注释以
/*
开头,以*/
结尾。
-- 单行注释
/*
* 多行注释
*/