字符串函数和运算符
字符串运算符
运算符 | 表达式 & 描述 | 示例 |
---|---|---|
|| | expression1 || expression2 [ || expression ] ... 可连接两个或多个表达式。 | 'Abcde' || 1 || 23 → Abcde123 |
^@ | string ^@ substring 如果 string 以 substring 开头,则返回 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'
此函数仅支持 UTF8 编码。RisingWave 使用 UTF8 编码存储文本,因此此函数主要用作类型转换操作。
convert_to
此函数可将字符串转换为 dest_encoding name
指定的编码,并返回一个字节数组。
convert_to(string text, dest_encoding name) → bytea
convert_to('Hello World', 'UTF8') → '\\x48656c6c6f20576f726c64'
此函数仅支持 UTF8 编码。RisingWave 使用 UTF8 编码存储文本,因此此函数主要用作类型转换操作。
decode
此函数可将输入字符串中的文本数据解码为二进制数据。支持的编码输入字符串格式包括 base64
、hex
和 escape
。
decode ( input_string, format_type ) → bytea
decode('MTIz', 'base64') → '123'
encode
此函数可将 bytea 中的二进制数据编码为文本表示形式。支持的编码格式包括 base64
、hex
和 escape
。
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_string 和 format_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) → '  42'
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
right
可返回 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
,则匹配不区分大小写。
另外,还可以使用运算符 ~~
和 ~~*
,分别等同于 LIKE
和 ILIKE
。同样,运算符 !~~
和 !~~*
相当于 NOT LIKE
和 NOT ILIKE
。
通配符
- 模式中的下划线
_
可匹配任意单个字符。 - 百分号
%
可匹配任意由 0 个或多个字符组成的序列。
如果模式中不包含 _
或 %
,则其只代表字符串本身。例如,模式 'apple' 只匹配字符串 'apple'。在这种情况下,LIKE
的作用就类似于等号运算符 =
。
转义
要匹配文本的下划线或百分号,而不是匹配其他字符,必须在模式中相应字符前使用转义字符 \
。要匹配转义字符本身,请写两个转义字符:\\
。
可以使用 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