序号 | SQL 类型 | Golang 类型 | 说明 |
---|---|---|---|
1 | bigint | int64 | 整数 |
2 | double | float64 | 浮点数,总位数超过 15 位则有可能丢失精度 |
3 | string | string | 字符串 |
4 | date | int64 | 日期类型,详见NoSQL Date 类型详解。 |
序号 | SQL 语法 | 注意事项 |
---|---|---|
1 | Left Join/Full Join | 对于 ES/Hbase 等数据源,如果物理表设置了主键,则 On 语句和 Where 语句一起需要包含全部的主键列。 |
2 | Union All | 不支持 Union 和 Union Distinct 语句,Union 前后的查询不能有 Order by 语句。 |
3 | 子查询 | |
4 |
| 尽量不要写区间范围较大的过滤条件,尽可能用等值条件。 |
5 |
| 对主键字段建议成对使用(即一个字段必须既有大于或大于等于,又有小于或小于等于的限制) ,否则可能会因为查询性能风险而报错。 |
6 |
| 慎重依赖 json 系列 UDF 做过滤条件。 |
7 |
| 预估数据量较大时,UDAF 的参数不要存在算数计算,将大概率被判定为慢SQL 注意 所有聚合函数都会忽略 NULL 值,对齐 MySQL,特例是 count(1) 会包含 NULL 值,而 count(字段)不会; |
8 | 别名(as) | |
9 | Case when | |
10 |
| 其中除法遇到除数为 0 的情况,会返回 NULL。 |
11 |
| 如果需要对聚合结果排序,对聚合字段手动指定别名,order by 使用别名; |
12 | Limit m,n | 每条 SQL 最好带上 limit,否则将使用逻辑表的默认 limit 配置; |
13 | UDF: | 在 order by 中使用 UDF 需要慎重,可以通过提工单的方式,咨询 DataLeap-数据服务支持同学; |
序号 | 函数名称 | 语法格式 | 函数详情 | 参数 | 示例 |
---|---|---|---|---|---|
1 | coalesce | coalesce(`expression1`, `expression2`, ..., `default_value`) | 这个函数主要用来进行空值处理,如果 expression 不为空值则返回 expression;否则判断 value1 是否是空值,如果 value1 不为空值则返回value1;否则判断 value2 是否是空值,如果 value2 不为空值则返回value2;…… | `expression1`,`expression2`为任意表达式 | SELECT a/b, COALESCE(a/b, 0) from T where f='?' |
2 | date_format | DATE_FORMAT(`date`,`format`) | 函数用于以不同的格式显示日期/时间数据 | `date` 时间戳; | SELECT DATE_FORMAT(1635857473, '%W %M %Y') |
3 | length | length(`str`) | 函数返回文本字段中值的长度,基于字节数统计 | `str` 任意字符串或者 string 字段 | length('abc') |
4 | substring | SUBSTRING(`str`,`pos`,`len`) | 查询一个字符串从某个位置开始的一定长度的子串 | `str` 字符串字面量 /string 类型字段; | SELECT SUBSTRING("abcdefg",5) from T where f='?' |
5 | fuzzy_like | fuzzy_like(`string_field`, `pattern`) | 用于非精确过滤,只要包含 pattern 即算作满足条件(对于 ES 数据源相对直接使用 like 速度会更快,但是精度会低一些,取决于 ES 的分词配置) | `str_field` 一个字符串字段,待匹配的目标; | 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的逻辑字段名; | 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 的逻辑字段名; | select json_map_get(field2, 'k') from t where f=? |
8 | concat | concat(`field1`, `field2`, `stringArg`, `intArg`, `floatArg`...) | 字符串拼接 | `field1`, `field2` 为逻辑字段; | 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 的逻辑字段名; | select json_array_has('[a, b, c]', '1') from t where f=? |
其它更多函数请参考 2 函数。
序号 | 函数名称 | 语法格式 | 函数详情 | 参数 | 示例 |
---|---|---|---|---|---|
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 |
序号 | SQL语法 |
---|---|
1 | right join |
2 | union/union all |
3 | having |
4 | over |
5 | distinct; |
6 | Group by 字段不支持任何表达式计算 |
7 | Order by 不得直接使用聚合函数,必须使用别名 |
8 | if |
9 | On 字段不支持任何表达式计算 |
说明
其中部分不支持的语法(如 Count(Distinct) )可以在 SQL 中通过 UDF 函数来实现。