跳到主要内容
版本:latest

参考

CnosDB 中的标识符、字面量和运算操作符的用法,以及一些SQL中常用的运算符。同时还介绍了运算符的优先级和一些其他相关内容。

标识符

用于命名数据库对象,例如 tablecolumn 名称。

引用

标识符 上使用双引号区分大小写,在字符串字面量上使用单引号。

不带引号的标识符在 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 字面量是 truefalse

持续时间单位

间隔字面量指定长度或时间单位。

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

保证比较结果是 truefalse 并且不是空集。

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=、>=、<=、<>、!=、>、<(比较运算符)
4NOT
5AND
6BETWEEN、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,计算右表达式的值,都为 truetrue
OR先求左表达式的值,如果为 false,计算右表达式的值,都为 falsefalse
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;

注释

  • 单行注释使用双连字符 -- 符号。单行注释以换行符结尾。
  • 多行注释以 /* 开头,以 */ 结尾。
-- 单行注释

/*
* 多行注释
*/