首页 / 字符串
字符串函数对照
字符串函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 12 个函数。其中 8 个函数在部分引擎中需要改写或没有对应函数。
目录:concat · concat_ws · instr · length · lpad · regexp_extract · regexp_replace · rlike · split · split_part · substr · substring_index
CONCAT 字符串拼接
CONCAT 把多个字符串首尾相连。函数名在各引擎都一样,但遇到 NULL 的处理不同:MaxCompute、StarRocks、Doris 和 Flink 只要有一个参数为 NULL 就返回 NULL,Hologres 会直接忽略 NULL。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | CONCAT(str1, str2[, ...]) |
| Hologres | 支持 | CONCAT(str1, str2, ...) |
| StarRocks | 支持 | concat(str, ...) |
| Doris | 支持 | CONCAT(expr[, expr ...]) |
| Hive | 支持 | concat(str1, str2, ...) |
| Spark SQL | 支持 | concat(col1, col2, ..., colN) |
| Flink SQL | 支持 | CONCAT(string1, string2, ...) |
CONCAT_WS 按分隔符拼接
CONCAT_WS 用指定的分隔符拼接多个字符串或一个字符串数组。多数引擎会跳过 NULL 值,但 MaxCompute 只要有一个参数为 NULL 就返回 NULL。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | CONCAT_WS(separator, str1, str2[, ...]) |
| Hologres | 支持 | CONCAT_WS(sep, str[, str ...]) |
| StarRocks | 支持 | concat_ws(sep, str, ...) |
| Doris | 支持 | CONCAT_WS(sep, str[, str]) |
| Hive | 支持 | concat_ws(SEP, A, B, ...) |
| Spark SQL | 支持 | concat_ws(sep[, str | array(str)]+) |
| Flink SQL | 支持 | CONCAT_WS(string1, string2, string3, ...) |
INSTR 查找子串位置
INSTR 返回子串在字符串中第一次出现的位置,下标从 1 开始,找不到时返回 0。多数引擎同名可用,Hologres 要改用 STRPOS。只有 MaxCompute 支持起始位置和第 N 次出现这两个参数,LOCATE 和 POSITION 的参数顺序与 INSTR 相反。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | INSTR(str1, str2[, start_position[, nth_appearance]]) |
| Hologres | 需改写 | STRPOS(str, substr) |
| StarRocks | 支持 | instr(str, substr) |
| Doris | 支持 | INSTR(str, substr) |
| Hive | 支持 | instr(str, substr) |
| Spark SQL | 支持 | instr(str, substr) |
| Flink SQL | 支持 | INSTR(string1, string2) |
LENGTH 字符串长度
LENGTH 在不同引擎中统计的单位不同:StarRocks 和 Doris 的 LENGTH 返回字节数,一个汉字算 3;Hologres、Hive 和 Spark 的 LENGTH 返回字符数。按字符计数时,StarRocks 和 Doris 要改用 CHAR_LENGTH,Flink 也只有 CHAR_LENGTH。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | LENGTH(str) |
| Hologres | 支持 | LENGTH(str) |
| StarRocks | 需改写 | char_length(str) |
| Doris | 需改写 | CHAR_LENGTH(str) |
| Hive | 支持 | length(string A) |
| Spark SQL | 支持 | length(expr) |
| Flink SQL | 别名 | CHAR_LENGTH(string) |
LPAD 左侧补齐
LPAD(str, len, pad) 在左侧用 pad 补齐到 len 个字符,str 比 len 长时截断。七个引擎都同名可用,差异在边界情况:填充串为空时 Hive 返回 NULL、Doris 返回空字符串;StarRocks、Spark 和 Hologres 可以省略 pad,默认补空格。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | LPAD(str1, length, str2) |
| Hologres | 支持 | LPAD(str, length[, fill]) |
| StarRocks | 支持 | lpad(str, len[, pad]) |
| Doris | 支持 | LPAD(str, len, pad) |
| Hive | 支持 | lpad(string str, int len, string pad) |
| Spark SQL | 支持 | lpad(str, len[, pad]) |
| Flink SQL | 支持 | LPAD(string1, integer, string2) |
REGEXP_EXTRACT 正则提取
REGEXP_EXTRACT 用正则表达式匹配字符串,返回指定分组的内容。除 Hologres 外都同名可用,但分组参数是否必填、没有匹配时返回空字符串还是 NULL、正则语法和反斜杠转义都有差异。Hologres 要用 REGEXP_MATCH 加数组下标改写。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | REGEXP_EXTRACT(source, pattern[, group_id]) |
| Hologres | 需改写 | (REGEXP_MATCH(str, pattern))[n] |
| StarRocks | 支持 | regexp_extract(str, pattern, pos) |
| Doris | 支持 | REGEXP_EXTRACT(str, pattern, pos) |
| Hive | 支持 | regexp_extract(subject, pattern, index) |
| Spark SQL | 支持 | regexp_extract(str, regexp[, idx]) |
| Flink SQL | 支持 | REGEXP_EXTRACT(string1, string2[, integer]) |
REGEXP_REPLACE 正则替换
REGEXP_REPLACE 用正则表达式查找并替换字符串。最大的差异在 Hologres:它沿用 PostgreSQL 的行为,默认只替换第一处匹配,要加 'g' 才会全部替换。各引擎的正则语法也不完全相同。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | REGEXP_REPLACE(source, pattern, replace_string[, occurrence]) |
| Hologres | 支持 | REGEXP_REPLACE(str, regex, replacement[, flags]) |
| StarRocks | 支持 | regexp_replace(str, pattern, repl) |
| Doris | 支持 | REGEXP_REPLACE(str, pattern, repl) |
| Hive | 支持 | regexp_replace(INITIAL_STRING, PATTERN, REPLACEMENT) |
| Spark SQL | 支持 | regexp_replace(str, regexp, rep[, position]) |
| Flink SQL | 支持 | REGEXP_REPLACE(string1, string2, string3) |
RLIKE 正则匹配判断
RLIKE 判断字符串是否匹配正则表达式,只要有一段子串匹配就返回真。MaxCompute、Hive 和 Spark 支持 RLIKE 运算符;StarRocks、Doris 和 Flink 用 REGEXP 函数;Hologres 文档中没有对应的运算符,需要借助 REGEXP_MATCH。各引擎的正则语法和返回类型不同。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | A RLIKE B |
| Hologres | 需改写 | REGEXP_MATCH(str, pattern) IS NOT NULL |
| StarRocks | 需改写 | regexp(expr, pattern) |
| Doris | 需改写 | REGEXP(str, pattern) |
| Hive | 支持 | A RLIKE B |
| Spark SQL | 支持 | str RLIKE regexp |
| Flink SQL | 需改写 | REGEXP(string1, string2) |
SPLIT 字符串拆分
SPLIT 按分隔符把字符串拆成数组。MaxCompute、Hive 和 Spark 的分隔符按正则表达式处理,Doris 要改用 SPLIT_BY_STRING,Hologres 没有 SPLIT,要用 REGEXP_SPLIT_TO_ARRAY。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SPLIT(source, delimiter[, trimTailEmpty]) |
| Hologres | 需改写 | REGEXP_SPLIT_TO_ARRAY(str, pattern) |
| StarRocks | 支持 | split(content, delimiter) |
| Doris | 需改写 | SPLIT_BY_STRING(str, separator) |
| Hive | 支持 | split(str, pat) |
| Spark SQL | 支持 | split(str, regex[, limit]) |
| Flink SQL | 支持 | SPLIT(string, delimiter) |
SPLIT_PART 按分隔符取第 N 段
SPLIT_PART 按分隔符切分字符串,返回第 N 段,下标从 1 开始。多数引擎同名可用,但下标越界时有的返回空字符串,有的返回 NULL;Hive 要用 split 加数组下标改写,Flink 的 SPLIT_INDEX 下标从 0 开始。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SPLIT_PART(str, delimiter, start[, end]) |
| Hologres | 支持 | SPLIT_PART(str, delimiter, num) |
| StarRocks | 支持 | split_part(content, delimiter, field) |
| Doris | 支持 | SPLIT_PART(str, separator, part_index) |
| Hive | 需改写 | split(str, pat)[n - 1] |
| Spark SQL | 支持 | split_part(str, delimiter, partNum) |
| Flink SQL | 需改写 | SPLIT_INDEX(str, delimiter, n - 1) |
SUBSTR 截取子串
SUBSTR 从指定位置截取字符串。各引擎都从 1 开始计数,负数表示从末尾倒数;起始位置写 0 时,多数引擎返回空字符串。Hologres 的 SUBSTR 需要 orafce 扩展,标准写法是 SUBSTRING。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SUBSTR(str, start_position[, length]) |
| Hologres | 需改写 | SUBSTRING(str FROM start FOR len) |
| StarRocks | 支持 | substr(str, pos[, len]) |
| Doris | 支持 | SUBSTRING(str, pos[, len]) |
| Hive | 支持 | substr(str, start[, len]) |
| Spark SQL | 支持 | substr(str, pos[, len]) |
| Flink SQL | 支持 | SUBSTR(string, integer1[, integer2]) |
SUBSTRING_INDEX 按分隔符截取
SUBSTRING_INDEX(str, delim, count) 返回第 count 个分隔符之前的部分,count 为负数时从右边数。MaxCompute、StarRocks、Doris、Hive 和 Spark 同名可用,count 为 0 时结果不同;Hologres 和 Flink 没有这个函数。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SUBSTRING_INDEX(str, separator, count) |
| Hologres | 不支持 | — |
| StarRocks | 支持 | substring_index(str, delimiter, count) |
| Doris | 支持 | SUBSTRING_INDEX(content, delimiter, field) |
| Hive | 支持 | substring_index(string A, string delim, int count) |
| Spark SQL | 支持 | substring_index(str, delim, count) |
| Flink SQL | 不支持 | — |