字符串替换函数
overlay
从基于 1 的索引 offset 开始,用另一个字符串 replace 替换字符串 input 的一部分。
语法
overlay(s, replace, offset[, length])
参数
s:String 类型的字符串。replace:String 类型的字符串。offset:Int 类型的整数(基于 1)。如果offset为负数,则从字符串s的末尾开始计数。length:可选。Int 类型的整数。length指定要替换的输入字符串s中代码段的长度。如果未指定length,则从s中删除的字节数等于replace的长度;否则删除length个字节。
返回值
- String 数据类型的值。
示例
SELECT overlay('My father is from Mexico.', 'mother', 4) AS res;
结果
┌─res──────────────────────┐
│ My mother is from Mexico.│
└──────────────────────────┘
SELECT overlay('My father is from Mexico.', 'dad', 4, 6) AS res;
结果
┌─res───────────────────┐
│ My dad is from Mexico.│
└───────────────────────┘
overlayUTF8
从基于 1 的索引 offset 开始,用另一个字符串 replace 替换字符串 input 的一部分。
假定字符串包含有效的 UTF-8 编码文本。如果违反此假设,则不会抛出异常,并且结果未定义。
语法
overlayUTF8(s, replace, offset[, length])
参数
s:String 类型的字符串。replace:String 类型的字符串。offset:Int 类型的整数(基于 1)。如果offset为负数,则从输入字符串s的末尾开始计数。length:可选。Int 类型的整数。length指定要替换的输入字符串s中代码段的长度。如果未指定length,则从s中删除的字符数等于replace的长度;否则删除length个字符。
返回值
- String 数据类型的值。
示例
SELECT overlay('Mein Vater ist aus Österreich.', 'der Türkei', 20) AS res;
结果
┌─res───────────────────────────┐
│ Mein Vater ist aus der Türkei.│
└───────────────────────────────┘
replaceOne
将 haystack 中子字符串 pattern 的首次出现替换为 replacement 字符串。
语法
replaceOne(haystack, pattern, replacement)
replaceAll
将 haystack 中子字符串 pattern 的所有出现替换为 replacement 字符串。
语法
replaceAll(haystack, pattern, replacement)
别名:replace。
replaceRegexpOne
将 haystack 中与正则表达式 pattern(在 re2 语法中)匹配的子字符串的首次出现替换为 replacement 字符串。
replacement 可以包含替换 \0-\9。替换 \1-\9 对应于第 1 到第 9 个捕获组(子匹配项),替换 \0 对应于整个匹配项。
要在 pattern 或 replacement 字符串中使用原义 \ 字符,请使用 \ 对其进行转义。另请记住,字符串文字需要额外的转义。
语法
replaceRegexpOne(haystack, pattern, replacement)
示例
将 ISO 日期转换为美国格式
SELECT DISTINCT
EventDate,
replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res
FROM test.hits
LIMIT 7
FORMAT TabSeparated
结果
2014-03-17 03/17/2014
2014-03-18 03/18/2014
2014-03-19 03/19/2014
2014-03-20 03/20/2014
2014-03-21 03/21/2014
2014-03-22 03/22/2014
2014-03-23 03/23/2014
复制字符串十次
SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res
结果
┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
replaceRegexpAll
类似于 replaceRegexpOne,但替换模式的所有出现。
别名:REGEXP_REPLACE。
示例
SELECT replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res
结果
┌─res────────────────────────┐
│ HHeelllloo,, WWoorrlldd!! │
└────────────────────────────┘
作为例外,如果正则表达式作用于空子字符串,则替换不会多次进行,例如:
SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
结果
┌─res─────────────────┐
│ here: Hello, World! │
└─────────────────────┘
regexpQuoteMeta
在正则表达式中具有特殊含义的字符前添加反斜杠:\0、\\、|、(、)、^、$、.、[、]、?、*、+、{、:、-。
此实现与 re2::RE2::QuoteMeta 略有不同。它将零字节转义为 \0 而不是 \x00,并且仅转义必需的字符。有关更多信息,请参阅 RE2
语法
regexpQuoteMeta(s)
format
使用参数中列出的值(字符串、整数等)格式化 pattern 字符串,类似于 Python 中的格式化。模式字符串可以包含用花括号 {} 包围的替换字段。任何未包含在花括号中的内容都被视为文字文本,并按原样复制到输出中。文字花括号字符可以用两个花括号转义:{{ '{{' }} 和 {{ '}}' }}。字段名称可以是数字(从零开始)或为空(然后它们被隐式地赋予单调递增的数字)。
语法
format(pattern, s0, s1, ...)
示例
SELECT format('{1} {0} {1}', 'World', 'Hello')
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello │
└─────────────────────────────────────────┘
使用隐式数字
SELECT format('{} {}', 'Hello', 'World')
┌─format('{} {}', 'Hello', 'World')─┐
│ Hello World │
└───────────────────────────────────┘
translate
使用由 from 和 to 字符串定义的一对一字符映射替换字符串 s 中的字符。from 和 to 必须是常量 ASCII 字符串。如果 from 和 to 具有相同的大小,则 s 中 first 的第 1 个字符的每次出现都将替换为 to 的第 1 个字符,s 中 first 的第 2 个字符将替换为 to 的第 2 个字符,依此类推。如果 from 包含的字符多于 to,则从 s 中删除 from 末尾处的所有没有 to 中对应字符的字符的出现。s 中的非 ASCII 字符不会被函数修改。
语法
translate(s, from, to)
示例
SELECT translate('Hello, World!', 'delor', 'DELOR') AS res
结果
┌─res───────────┐
│ HELLO, WORLD! │
└───────────────┘
from 和 to 参数具有不同的长度
SELECT translate('clickhouse', 'clickhouse', 'CLICK') AS res
结果
┌─res───┐
│ CLICK │
└───────┘
translateUTF8
类似于 translate,但假定 s、from 和 to 是 UTF-8 编码的字符串。
语法
translateUTF8(s, from, to)
参数
返回值
- String 数据类型的值。
示例
查询
SELECT translateUTF8('Münchener Straße', 'üß', 'us') AS res;
┌─res──────────────┐
│ Munchener Strase │
└──────────────────┘
printf
printf 函数使用参数中列出的值(字符串、整数、浮点数等)格式化给定的字符串,类似于 C++ 中的 printf 函数。格式字符串可以包含以 % 字符开头的格式说明符。任何未包含在 % 和后面的格式说明符中的内容都被视为文字文本,并按原样复制到输出中。文字 % 字符可以用 %% 转义。
语法
printf(format, arg1, arg2, ...)
示例
查询
select printf('%%%s %s %d', 'Hello', 'World', 2024);
┌─printf('%%%s %s %d', 'Hello', 'World', 2024)─┐
│ %Hello World 2024 │
└──────────────────────────────────────────────┘