You need to enable JavaScript to run this app.
导航
NoSQL 语法规范
最近更新时间:2024.07.31 18:40:41首次发布时间:2024.07.12 16:01:05

1 NoSQL 规范

  • NoSQL 语法规范与标准 SQL 语法一致,支持部分函数;
  • 若逻辑表配置了查询约束,查询条件必须命中其中一条约束;
  • SQL 中可以使用占位符;

2 已支持的数据类型

序号

SQL 类型

Golang 类型

说明

1

bigint

int64

整数

2

double

float64

浮点数,总位数超过 15 位则有可能丢失精度

3

string

string

字符串

4

date

int64

日期类型,详见NoSQL Date 类型详解

3 已支持的常用语法

序号

SQL 语法

注意事项

1

Left Join/Full Join

对于 ES/Hbase 等数据源,如果物理表设置了主键,则 On 语句和 Where 语句一起需要包含全部的主键列。

2

Union All

不支持 Union 和 Union Distinct 语句,Union 前后的查询不能有 Order by 语句。

3

子查询

4

  • =
  • In
  • between and

尽量不要写区间范围较大的过滤条件,尽可能用等值条件。

5

  • >
  • >=
  • <
  • <=

对主键字段建议成对使用(即一个字段必须既有大于或大于等于,又有小于或小于等于的限制) ,否则可能会因为查询性能风险而报错。

6

  • like
  • is null
  • is not null

慎重依赖 json 系列 UDF 做过滤条件。

7

  • sum、max、min、avg、count
  • group by

预估数据量较大时,UDAF 的参数不要存在算数计算,将大概率被判定为慢SQL

注意

所有聚合函数都会忽略 NULL 值,对齐 MySQL,特例是 count(1) 会包含 NULL 值,而 count(字段)不会;
聚合函数内最好不要包含 UDF 和 case when

8

别名(as)

9

Case when

10

  • +
  • -
  • *
  • /

其中除法遇到除数为 0 的情况,会返回 NULL。

11

  • Order by desc
  • Order by asc

如果需要对聚合结果排序,对聚合字段手动指定别名,order by 使用别名;
在 order by 中慎重使用算数计算和 UDF,将有可能导致查询超时
当前 order by 的字段必须在 select 字段中有完整对应。

12

Limit m,n

每条 SQL 最好带上 limit,否则将使用逻辑表的默认 limit 配置
暂定数据量拉取上限是 1W,如果超过,将立即报错并标识数据丢失。

13

UDF:
date_format、len、substring、json_map_get、json_array_get、json_array_has

在 order by 中使用 UDF 需要慎重,可以通过提工单的方式,咨询 DataLeap-数据服务支持同学
除 json 系列函数,其余使用均对标 MySQL。

4 已支持的 UDF 函数

序号

函数名称

语法格式

函数详情

参数

示例

1

coalesce

coalesce(`expression1`, `expression2`, ..., `default_value`)

这个函数主要用来进行空值处理,如果 expression 不为空值则返回 expression;否则判断 value1 是否是空值,如果 value1 不为空值则返回value1;否则判断 value2 是否是空值,如果 value2 不为空值则返回value2;……
以此类推,如果所有的表达式都为空值,则返回 NULL。

`expression1`,`expression2`为任意表达式

SELECT a/b, COALESCE(a/b, 0) from T where f='?'

2

date_format

DATE_FORMAT(`date`,`format`)

函数用于以不同的格式显示日期/时间数据

`date` 时间戳;
`format` 规定日期/时间的输出格式,对标mysql;
[详见 MySQL语法参考]

SELECT DATE_FORMAT(1635857473, '%W %M %Y')

3

length

length(`str`)

函数返回文本字段中值的长度,基于字节数统计

`str` 任意字符串或者 string 字段

length('abc')

4

substring

SUBSTRING(`str`,`pos`,`len`)

查询一个字符串从某个位置开始的一定长度的子串

`str` 字符串字面量 /string 类型字段;
`pos` 开始位置,从1开始;
`len` 表示需要的子串长度;
[详见 MySQL语法参考]

SELECT SUBSTRING("abcdefg",5) from T where f='?'

5

fuzzy_like

fuzzy_like(`string_field`, `pattern`)

用于非精确过滤,只要包含 pattern 即算作满足条件(对于 ES 数据源相对直接使用 like 速度会更快,但是精度会低一些,取决于 ES 的分词配置)

`str_field` 一个字符串字段,待匹配的目标;
`pattern` 一个字符串字面量,表示需要匹配的条件。

select fuzzy_like('aabb', 'a') from t where f=?

6

json_array_get

json_array_get(`json_array_format_field`, `index`)

从一个 json 数组字符串中获取指定位置的元素

`json_array_format_field` 逻辑字段类型为map_arr/int_arr/string_arr的逻辑字段名;
`index` 数组下标。

select json_array_get(field1, 1) from t where f=?

7

json_map_get

json_map_get(`json_object_format_field`,`key`)

从一个 json 对象字符串中获取指定位置元素

`json_object_format_field` 逻辑字段类型为 map 的逻辑字段名;
`key` json 字段的 key。

select json_map_get(field2, 'k') from t where f=?

8

concat

concat(`field1`, `field2`, `stringArg`, `intArg`, `floatArg`...)

字符串拼接

`field1`, `field2` 为逻辑字段;
`stringArg` 为 string 类型字面量,例如 'abc';
`intArg` 为 bigint 类型字面量,例如123;
`floatArg` 为 double 类型字面量,如 1.9

concat('abc', 1, 2.8, 'efg')

9

json_array_has

json_array_has(`json_array_format_field`, `arg`)

查询 json 数组中是否存在给定的元素

`json_array_format_field` 逻辑字段类型为 map_arr/int_arr/string_arr 的逻辑字段名;
`arg` 要判别的字段,可以是 string 类型、bigint 类型、double 类型字面量

select json_array_has('[a, b, c]', '1') from t where f=?

其它更多函数请参考 2 函数

5 已支持的 UDAF 函数

序号

函数名称

语法格式

函数详情

参数

示例

1

min

min(`field`)

返回字段的最小值,对于数字类型返回数值最小的值,对于 string 类型返回字段序最小的值

`field`为逻辑字段名;

SELECT a, min(b) from T group by a

2

max

max(`field`)

返回字段的最大值,对于数字类型返回数值最大的值,对于 string 类型返回字段序最大的值

`field`为逻辑字段名;

SELECT a, max(b) from T group by a

3

avg

avg(`field`)

返回字段的平均值,对于数字类型返回平均值,不支持 string 类型

`field`为逻辑字段名;

SELECT a, avg(b) from T group by a

4

sum

sum(`field`)

返回字段的总和,对于数字类型返回总和,不支持 string 类型

`field`为逻辑字段名;

SELECT a, sum(b) from T group by a

5

count

count(`field`)

返回字段的非 nil 值个数的总和

`field`为逻辑字段名;

SELECT a, count(b) from T group by a

6

count_distinct

count_distinct(`field`

返回字段去重后的非 nil 值个数的总和

`field`为逻辑字段名;

SELECT a, count_distinct(b) from T group by a

6 不支持的常用语法

序号

SQL语法

1

right join

2

union/union all

3

having

4

over

5

distinct;
count(distinct)

6

Group by 字段不支持任何表达式计算

7

Order by 不得直接使用聚合函数,必须使用别名

8

if

9

On 字段不支持任何表达式计算

说明

其中部分不支持的语法(如 Count(Distinct) )可以在 SQL 中通过 UDF 函数来实现。