Skip to main content

字符串函数和运算符

字符串运算符

运算符表达式 & 描述示例
||expression1 || expression2 [ || expression ] ...
可连接两个或多个表达式。
'Abcde' || 1 || 23 Abcde123
^@string ^@ substring
如果 stringsubstring 开头,则返回 true(t)。该运算符等同于 starts_with() 函数。
'abcdef' ^@ 'abc't

字符串函数

ascii

此函数可返回 input_string 第一个字符的 Unicode 码位。如果字符串为空,则返回 NULL

句法
ascii ( input_string ) → int
示例
ascii('RisingWave')82
ascii('🌊')127754

bit_length

此函数可返回输入字符串的位数,即 octet_length 的 8 倍。

句法
bit_length ( input_string ) → integer
示例
bit_length('wave')32

btrim

此函数等同于 trim (BOTH),可从输入字符串的开头和结尾处删除指定的字符。

句法
btrim ( input_string [, characters ] ) → output_string
示例
btrim(' cake ')'cake'
btrim('abcxyzabc', 'cba')'xyz'

char_length, character_length, length

以上函数可返回输入字符串的字符数。

句法
char_length ( input_string ) → integer_output
character_length ( input_string ) → integer_output
length ( input_string ) → integer_output
示例
char_length('wave')4

chr

此函数可返回与输入整数值对应的 Unicode 码位字符。

句法
chr ( input_int ) → string
示例
chr(65)'A'

concat

此函数可用于连接参数。忽略 NULL 参数。

句法
concat ( any_input-value_1 [, any_input-value_2 [, ...] ]) → output_string
示例
concat('Abcde', 2, NULL, 22)'Abcde222'

concat_ws

此函数可用分隔符连接参数。第一个参数用作分隔符,且不能为 NULL。忽略其他 NULL 参数。

句法
concat_ws ( separator_string, any_input-value_1 [, any_input-value_2 [, ...] ]) → output_string
示例
concat_ws(',', 'Abcde', 2, NULL, 22)'Abcde,2,22'

convert_from

此函数可将字符串转换为数据库编码。原始编码由 src_encoding name 指定。字符串必须在此编码中有效。

句法
convert_from(string bytea, src_encoding name)  →  text
示例
convert_from('\x4346464558'::bytea, 'utf8')'CFFEX'
note

此函数仅支持 UTF8 编码。RisingWave 使用 UTF8 编码存储文本,因此此函数主要用作类型转换操作。


convert_to

此函数可将字符串转换为 dest_encoding name 指定的编码,并返回一个字节数组。

句法
convert_to(string text, dest_encoding name) → bytea
示例
convert_to('Hello World', 'UTF8')'\\x48656c6c6f20576f726c64'
note

此函数仅支持 UTF8 编码。RisingWave 使用 UTF8 编码存储文本,因此此函数主要用作类型转换操作。


decode

此函数可将输入字符串中的文本数据解码为二进制数据。支持的编码输入字符串格式包括 base64hexescape

句法
decode ( input_string, format_type ) → bytea
示例
decode('MTIz', 'base64')'123'

encode

此函数可将 bytea 中的二进制数据编码为文本表示形式。支持的编码格式包括 base64hexescape

句法
encode ( bytea, format_type ) → output_string
示例
encode(E'123'::bytea, 'base64')'MTIz'

format

此函数可根据格式字符串生成格式化的输出,其形式类似于 C 函数 sprintf

句法
format( format_string [, format_arg [, ...] ] ) → output_string

format_string 可指定 output_string 的格式。它由文本和格式说明符组成。文本会直接复制到输出字符串。格式说明符是要插入输出字符串中的参数的占位符。格式说明符的数量应小于等于参数的数量。

格式说明符的句法:

%type

type 是格式转换类型,用于生成格式说明符的输出。

type 允许的值有:

  • s:将参数值格式化为字符串。NULL 将被视为空字符串。
  • I:将参数值视为 SQL 标识符。

请注意 format_stringformat_arg 可以是变量。

例如,以下查询在 RisingWave 中运行良好。

SELECT format(f, a, b) from (values
('%s %s', 'Hello', 'World'),
('%s%s', 'Hello', null),
(null, 'Hello', 'World')
) as t(f, a, b);
----
Hello World
Hello
NULL

initcap

该函数可将输入字符串中每个单词的第一个字母转换为大写,其余字符转换为小写。

句法
initcap ( input_string ) → string
示例
initcap('POWERFUL and flexible')'Powerful And Flexible'

lower

此函数可将字符串转换为全部小写。

句法
lower ( input_string ) → output_string
示例
lower('TOM')'tom'

left

此函数可返回输入字符串中的第一个整数字符。如果输入整数是负数,则从输出字符串中删除最后 input_integer 个字符。

句法
left ( input_string, input_integer ) → output_string
示例
left('risingwave', 4)'risi'
left('risingwave', -4)'rising'

lpad

此函数可在输入字符串左侧填充空格,直至达到指定的输入整数长度。如果输入字符串超过输入整数长度,则会截断到指定长度。提供可选的填充字符串后,空格会被填充字符串取代。

句法
lpad ( input_string, input_int ) → string

lpad ( input_string, input_int, padding_string ) → string
示例
lpad('42', 5)'  &nbsp42'
lpad('42', 5, 'R')'RRR42'

ltrim

此函数等同于 trim (LEADING),可从输入字符串的开头删除指定的字符。

句法
ltrim ( input_string [, characters ] ) → output_string
示例
ltrim(' cake ')'cake '
ltrim('abcxyzabc', 'cba')'xyzabc'

octet_length

此函数可返回字符串的字节数。

句法
octet_length ( input_string )
示例
octet_length('wave')4

overlay

此函数可用一个子串替换输入字符串中的从指定位置开始的子串,长度可选。如果省略了长度,则其值即为子串的长度。

句法
overlay ( input_string PLACING substring FROM start_int [ FOR length_int ] ) → output_string
示例
overlay('yabadoo' PLACING 'daba' FROM 5 FOR 0)'yabadabadoo'
overlay('abcdef' PLACING '45' FROM 4)'abc45f'
overlay('RisingWave' PLACING '🌊' FROM 7)'Rising🌊ave'

position

此函数可返回输入字符串中指定子串的起始索引,如果没有则返回 0。

句法
position ( substring in input_string ) → integer_output
示例
position('ing' in 'rising')4

regexp_count

可返回 POSIX 正则表达式模式在 input_string 中出现的次数。支持反向引用、正向先行断言、负向先行断言、正向后行断言和负向后行断言。可选 flag 包括不区分大小写匹配的 i 和区分大小写匹配的 c

句法
regexp_count( input_string, pattern [, start_int [, optional_flag ]] ) → output_int
示例
regexp_count('ABCABCAXYaxy', 'A.', 1, 'c')3
regexp_count('ABCABCAXYaxy', 'A.', 2, 'c')2

regexp_match

可返回一个字符串数组,即 POSIX 正则表达式模式与字符串首次匹配后捕获的子字符串。如果没有匹配结果,则返回 NULL。支持反向引用、正向先行断言、负向先行断言、正向后行断言和负向后行断言。可选 flag 包括不区分大小写匹配的 i 和区分大小写匹配的 c

句法
regexp_match( input_string, pattern [, optional_flag ] ) → matched_string[]
示例
regexp_match('foobarbequebaz', '(bar)(beque)'){bar,beque}
regexp_match('abc', 'd') → NULL
regexp_match('abc', 'Bc', 'ici'){bc}

regexp_matches

可返回字符串数组集合,即 POSIX 正则表达式模式与字符串匹配后捕获的子字符串。默认情况下返回所有匹配结果。支持反向引用、正向先行断言、负向先行断言、正向后行断言和负向后行断言。可选 flag 包括不区分大小写匹配的 i 和区分大小写匹配的 c

句法
regexp_matches( input_string, pattern [, optional_flag ] ) → set_of_matched_string[]
示例
regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)')
{bar,beque}
{bazil,barf}

regexp_matches('abcabc', 'Bc', 'i')
{bc}
{bc}

regexp_replace

可替换 input_string 中与 POSIX 正则表达式 pattern 第一个匹配或第 N 个匹配的子串,从可选的 start_integer 指定的字符索引开始。

支持反向引用、正向先行断言、负向先行断言、正向后行断言和负向后行断言。

可选 flag 可以修改匹配行为:

  • g flag 表示应替换输入字符串中出现的所有模式。如果不使用,则只替换第一次出现的内容。
  • i flag 可启用不区分大小写匹配。
  • c flag 可启用区分大小写匹配。

Note: 如果使用 start_integer,则不可使用 flags,除非同时指定 N_integer

句法
regexp_replace( input_string, pattern, replacement_string [, start_integer [, N_integer ] ] [, flags ] ) → output_string
示例
regexp_replace('foobarbaz', 'b(..)', 'X\1Y', 'g') → fooXarYXazY

regexp_replace('HELLO world', '[aeiou]', 'X', 'ig') → HXLLX wXrld

regexp_replace('RisingWave', '[aeiou]', 'X', 1, 3, 'i') → RisingWXve

regexp_split_to_array

此函数可根据正则表达式模式将字符串拆分为子串数组。

句法
regexp_split_to_array ( input_string TEXT, pattern TEXT )TEXT[]
示例
regexp_split_to_array('apple,banana,orange', ',') → {apple,banana,orange}
regexp_split_to_array('apple.banana!orange', '[.!]') → {apple,banana,orange}
regexp_split_to_array('applebananaorange', ',') → {applebananaorange}

repeat

可重复 input_string 特定次数。当 times_int 为零、负数或空时,返回空值。

句法
repeat( input_string, times_int ) → output_string
示例
repeat('A1b2', 3) → A1b2A1b2A1b2

replace

可用子串 to_string 替换 input_string 中所有出现的子串 from_string

句法
replace( input_string, from_string, to_string ) → output_string
示例
replace('abcdefabcdef', 'cd', 'XX') → abXXefabXXef

reverse

可逆序返回 input_string 中的字符。

句法
reverse( input_string ) → string
示例
reverse('RisingWave') → evaWgnisiR

可返回 input_string 中最后一个 input_integer 字符。如果 input_integer 是负数,则会从 output_string 中删除第一个 |input_integer| 字符。

句法
right( input_string, input_integer ) → output_string
示例
right('risingwave', 4) → wave
right('risingwave', -4) → ngwave

rpad

可在输入字符串右侧填充空格,直至达到指定长度。如果字符串超过指定长度,则会截断到指定长度。提供可选的填充字符串后,空格会被填充字符串取代。

句法
rpad( input_string, input_int, padding_string ) → string
示例
rpad('42', 5)'42    '
rpad('42', 5, 'R')'42RRR'

rtrim

等同于 trim (TRAILING)

句法
rtrim( input_string[, characters] ) → output_string
示例
rtrim(' cake ')'cake'
rtrim('abcxyzabc', 'cba')'abcxyz'

split_part

可在分隔符字符串出现的地方分割输入字符串,并返回第 n 个字段(从 1 开始计算)。当 n 为负数时,返回倒数第 |n| 个字段。当 n 为零时,将返回 'InvalidParameterValue' 错误信息。当输入分隔符字符串为空字符串时,如果查询的是第一个或最后一个字段,则返回输入字符串。否则,返回空字符串。

句法
split_part( input_string, delimiter_string, int_n ) → varchar
示例
split_part('abc~@~def~@~ghi', '~@~', 2)'def'

starts_with

如果输入字符串以指定的前缀字符串开头,则返回 true,否则返回 false。

句法
starts_with( input_string, prefix_string ) → boolean
示例
starts_with('RisingWave is powerful', 'Rising')true

substr/substring

可从 input_string 的 start_int 位置开始提取长度为 count_int 的子字符串。

句法
substr( input_string, start_int[, count_int] ) → output_string
示例
substr('alphabet', 3)'phabet';
substring('alphabet', 3, 2)'ph'

to_ascii

可将输入字符串中的非 ASCII 字符替换为最接近的 ASCII 等效字符。

句法
to_ascii( input_string ) → string
示例
to_ascii('Café')'Cafe'

to_hex

可将 input_int 或 input_bigint 转换为十六进制字符串。

句法
to_hex( input_int ) → string
示例
to_hex(255)'ff'
to_hex(123456789012345678)'1b69b4ba630f34e'

translate

可将 input_string 中与 from_string 中的字符匹配的每个字符替换为 to_string 中相应的字符。

句法
translate( input_string, from_string, to_string ) → output_string
示例
translate('M1X3', '13', 'ae')'MaXe'

trim

可从 input_string 的开头、结尾或两端(默认为两端)删除最长连续字符子串,该子串只包含 characters 中指定的字符(如果没有指定,默认为空格)。

有两种不同的句法。

句法
trim( [ LEADING | TRAILING | BOTH ] [ characters ] FROM input_string ) → output_string
句法
trim( [ LEADING | TRAILING | BOTH ]  [FROM ] input_string[, characters] ) → output_string
示例
trim(' cake ')'cake'
trim(both 'cba' from 'abcxyzabc')'xyz'
trim(both from 'abcxyzabc', 'cba')'xyz'
trim('abcxyzabc', 'cba')'xyz'

upper

可将字符串转换为全大写。

句法
upper( input_string ) → output_string
示例
upper('tom')'TOM'

LIKE 模式匹配表达式

string [ NOT ] { LIKE | ILIKE } pattern

string [!]~~[*] pattern

如果字符串与提供的模式匹配,LIKE 表达式返回 true。如果 LIKE 返回 true,则 NOT LIKE 表达式返回 false。若用 ILIKE 代替 LIKE,则匹配不区分大小写。

另外,还可以使用运算符 ~~~~*,分别等同于 LIKEILIKE。同样,运算符 !~~!~~* 相当于 NOT LIKENOT ILIKE

通配符

  • 模式中的下划线 _ 可匹配任意单个字符。
  • 百分号 % 可匹配任意由 0 个或多个字符组成的序列。

如果模式中不包含 _%,则其只代表字符串本身。例如,模式 'apple' 只匹配字符串 'apple'。在这种情况下,LIKE 的作用就类似于等号运算符 =

转义

要匹配文本的下划线或百分号,而不是匹配其他字符,必须在模式中相应字符前使用转义字符 \。要匹配转义字符本身,请写两个转义字符:\\

note

可以使用 ESCAPE '' 关闭转义机制,但不支持使用 ESCAPE 子句自定义转义字符。

示例

'abc' LIKE 'abc'           true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false

SIMILAR TO 模式匹配表达式

string [ NOT ] SIMILAR TO pattern [ ESCAPE escape-character ]

如果字符串与提供的模式匹配,SIMILAR TO 表达式返回 true。如果 SIMILAR TO 表达式返回 true,则 NOT SIMILAR TO 表达式返回 false。匹配区分大小写。

元字符

运算符描述
%匹配零个或多个字符的任意序列。
_匹配任意单个字符。
|表示选择(两个备选项之一)。
*重复前一项零次或更多次。
+重复前一项一次或多次。
?重复前一项零次或一次。
{m}重复前一项 m 次。
{m,}重复前一项 m 次或更多次。
{m,n}重复前一项至少 m 次,并且不超过 n 次。
()括号可把多个项组合成一个逻辑项。
[...]方括号表达式可指定字符类。

Escape

要匹配文本的元字符,可在模式中相应字符前使用转义字符 \。要匹配转义字符本身,请写两个转义字符:\\

可以使用 ESCAPE '' 关闭转义机制。ESCAPE 子句支持自定义转义字符,该字符必须为空或单个字符。

示例

'abc' SIMILAR TO 'a|b|c'                false
'abc' SIMILAR TO '(a|b|c)+' true
'a_b' SIMILAR TO 'a$_b' ESCAPE '$' true