本文介绍字符串函数的基本语法和示例。

基本语法

说明
  • 在日志服务分析语句中,表示字符串的字符必须使用单引号('')包裹,无符号包裹或被双引号("")包裹的字符表示字段名或列名。例如:'status'表示字符串status,status"status"表示日志字段status。
  • 如下函数中的key参数均表示日志字段名称。
函数名称 说明
chr(number) 返回与输入参数指定的ASCII码位值匹配的字符。
codepoint(key) 把ASCII码形式的字段值转换为BigInt类型。
length(key) 计算字符串的长度。

返回结果为INT类型。

lower(key) 将字符串转换为小写形式。

返回结果为VARCHAR类型,小写形式。

upper(key) 将字符串转化为大写字符。

返回结果为VARCHAR类型,大写形式。

lpad(key, length, lpad_string) 在字符串的左侧填充指定的子串,将字符串填充到一定长度。
length为整数,用于限制返回结果的长度。
  • 当字符串的长度小于length时,在字符串的左侧填充指定的子串。
  • 当字符串的长度大于length时,只返回字符串中的length个字符。

返回结果为VARCHAR类型。

rpad(key, length,rpad_string) 在字符串的右侧填充指定的子串,将字符串填充到一定长度。
length为整数,用于限制返回结果的长度。
  • 当字符串的长度小于length时,在字符串的右侧填充指定的子串。
  • 当字符串的长度大于length时,只返回字符串中的length个字符。

返回结果为VARCHAR类型。

trim(key) 删除字符串中开头和结尾的空格。

返回结果为VARCHAR类型。

ltrim(key) 删除字符串中开头的空格。

返回结果为VARCHAR类型。

rtrim(key) 删除字符串中结尾的空格。

返回结果为VARCHAR类型。

replace(key,substring,replace) 将字符串中所匹配的字符替换为其他指定字符。

返回结果为VARCHAR类型。

replace(key,substring) 删除字符串中匹配的字符。

返回结果为VARCHAR类型。

reverse(key) 返回反向顺序的字符串。
split(key,delimeter,N) 使用指定的分隔符拆分字符串,并返回N个子串集合。

返回结果为Array类型。

split_part(key,delimeter,part) 使用指定的分隔符拆分字符串,并返回指定位置的内容。

part为大于0的整数。

返回结果为VARCHAR类型。

split_to_map(key, delimiter01, delimiter02) 使用指定的第一个分隔符拆分字符串,然后再使用指定的第二个分隔符进行第二次拆分。

返回结果为MAP类型。

position(substring IN key) 返回目标子串在字符串中的位置。

返回结果为INT类型,从1开始。

strpos(key, substring) 返回目标子串在字符串中的位置。与position(substring IN key)函数等价。

返回结果为INT类型,从1开始。

substr(key, start) 返回字符串中指定位置的子串。

start表示开始提取子串的位置,从1开始。

返回结果为VARCHAR类型。

substr(key, start, length) 返回字符串中指定位置的子串,并限制子串长度。

start表示开始提取子串的位置,从1开始。length表示子串的长度。

返回结果为VARCHAR类型。

concat(key01,key02,key03) 将多个字符串拼接成一个字符串。

返回结果为INT类型,从1开始。

levenshtein_distance(key01, key02) 返回两个字符串的最小编辑距离。
hamming_distance (string1,string2) 返回两个字符串的汉明距离。

示例

基于如下日志样例介绍查询和分析语句示例。
http_user_agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2
request_uri:/request/path-1/file-9?0457349059345
scheme:https
server_protocol:HTTP/2.0
region:cn-shanghai
time: upstream_response_time:"80", request_time:"40"
  • 使用问号(?)拆分request_uri字段的值并返回第一个子串(即文件路径部分),然后统计不同路径对应的请求数量。
    * | SELECT count(*) AS PV, split_part(request_uri, '?', 1) AS Path GROUP BY Path ORDER BY pv DESC LIMIT 3
    TOP3访问地址
  • 提取server_protocol字段值中的前4个字符(即HTTP部分),然后统计HTTP协议对应的请求数量。
    * | SELECT substr(server_protocol,1,4) AS protocol, count(*) AS count GROUP BY server_protocol
    substr
  • 使用逗号(,)和冒号(:)拆分time字段的值,返回结果为MAP类型。
    * | SELECT split_to_map(time,',',':')
    split_to_map
  • 判断http_user_agent字段的值是否以字母M开头。
    * | SELECT substr(http_user_agent, 1, 1)=chr(77)
    substr
  • 返回字母H在server_protocol字段值中的位置。
    * | SELECT strpos(server_protocol,'H')
    strpos
  • 使用正斜线(/)将server_protocol字段的值拆分成2个子串,并返回子串的集合。
    * | SELECT split(server_protocol,'/',2)
    split
  • region字段值中的cn替换为中国
    * | select replace(region,'cn','中国')
    replace