SQL 方言通

首页 / 字符串

字符串函数对照

字符串函数在 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不支持—

其他分类

最近核对: