更新时间:2025-11-19 GMT+08:00
分享

截取字符串

btrim(string text [, characters text])

描述:去除字符串(string)两端指定的字符。

返回值类型:text

参数说明:

  • string,必选,目标字符串。
  • characters,可选,要在目标字符串两端移除的字符。characters参数缺省时,默认去除所有的空白字符。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT btrim('sring' , 'ing');
 btrim
-------
 sr
(1 row)

SELECT btrim('   sting  ');
 btrim
-------
 sting
(1 row)

substrb(text,int,int)

描述:从字符串中提取子字符串,第一个int表示提取的起始位置,第二个表示提取几个字节。

返回值类型:text

示例:

1
2
3
4
5
SELECT substrb('string',2,3);
 substrb
---------
 tri
(1 row)

substrb(text,int)

描述:从字符串中提取子字符串,int表示提取的起始位置。

返回值类型:text

示例:

1
2
3
4
5
SELECT substrb('string',2);
 substrb
---------
 tring
(1 row)

left(str text, n int)

描述:返回字符串的前n个字符。

  • ORA和TD兼容模式下,当n是负数时,返回除最后|n|个字符以外的所有字符。
  • MySQL兼容模式下,当n是负数时,返回空串。

返回值类型:text

示例:

1
2
3
4
5
 SELECT left('database', 4);
 left
------
 data
(1 row)

right(str text, n int)

描述:返回字符串中的后n个字符。

  • ORA和TD兼容模式下,当n是负数时,返回除前|n|个字符以外的所有字符。
  • MySQL兼容模式下,当n是负数时,返回空串。

返回值类型:text

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT right('abcde', 2);
 right
-------
 de
(1 row)

SELECT right('abcde', -2);
 right 
-------
 cde
(1 row)

substring(string [from int] [for int])

描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。

返回值类型:text

示例:

从字符串“Thomas”的第2个字符“h”开始连续截取3个字符,即返回“hom”。

1
2
3
4
5
SELECT substring('Thomas' from 2 for 3);
 substring
-----------
 hom
(1 row)

substring(string from pattern)

描述:截取匹配POSIX正则表达式的子字符串。如果没有匹配它返回空值,否则返回文本中匹配模式的那部分。

返回值类型:text

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SELECT substring('Thomas' from '...$');
 substring
-----------
 mas
(1 row)
SELECT substring('foobar' from 'o(.)b');
 substring 
--------
 o
(1 row)
SELECT substring('foobar' from '(o(.)b)');
 substring 
--------
 oob
(1 row)

如果POSIX正则表达式模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果想在表达式里使用圆括号而又不想导致这个例外,那么可以在整个表达式外边加上一对圆括号。

substring(string from pattern for escape)

描述:截取匹配SQL正则表达式的子字符串。声明的模式必须匹配整个数据串,否则函数失败并返回空值。为了标识在成功的时候应该返回的模式部分,模式必须包含逃逸字符的两次出现,并且后面要跟上双引号(")。匹配这两个标记之间的模式的文本将被返回。

返回值类型:text

示例:

1
2
3
4
5
SELECT substring('Thomas' from '%#"o_a#"_' for '#');
 substring
-----------
 oma
(1 row)

regexp_substr(text,text)

描述:正则表达式的抽取子串函数。与substr功能相似,正则表达式出现多个并列的括号时,也全部处理。

返回值类型:text

示例:

1
2
3
4
5
SELECT regexp_substr('str','[ac]');
 regexp_substr
---------------

(1 row)

regexp_matches(string text, pattern text [, flags text])

描述:返回string中所有匹配POSIX正则表达式的子字符串。如果pattern不匹配,该函数不返回行。如果模式不包含圆括号子表达式,则每一个被返回的行都是一个单一元素的文本数组,其中包括匹配整个模式的子串。如果模式包含圆括号子表达式,该函数返回一个文本数组,它的第n个元素是匹配模式的第n个圆括号子表达式的子串。

flags参数为可选参数,包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。

如果提供了最后一个参数,但参数值是空字符串(''),且数据库SQL兼容模式设置为ORA的情况下,会导致返回结果为空集。这是因为ORA兼容模式将''作为NULL处理,避免此类行为的方式有如下几种:

  • 将数据库SQL兼容模式改为TD。
  • 不提供最后一个参数,或最后一个参数不为空字符串。

返回值类型:setof text[]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
SELECT regexp_matches('foobarbequebaz', '(bar)(beque)');
 regexp_matches
----------------
 {bar,beque}
(1 row)

SELECT regexp_matches('foobarbequebaz', 'barbeque');
 regexp_matches 
----------------
 {barbeque}
(1 row)

SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
    regexp_matches    
--------------
 {bar,beque}
 {bazil,barf}
(2 rows)

如果没有子查询,当regexp_matches函数没有匹配上时,不会输出表中的数据。这通常不是所需的返回结果,应避免这种写法,建议可使用regexp_substr函数来实现相同的功能。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
SELECT * FROM tab;
 c1  | c2  
-----+-----
 dws | dws
(1 row)

SELECT c1, regexp_matches(c2, '(bar)(beque)') FROM tab;
 c1 | regexp_matches 
----+----------------
(0 rows)

SELECT c1, c2, (SELECT regexp_matches(c2, '(bar)(beque)')) FROM tab;
 c1  | c2  | regexp_matches 
-----+-----+----------------
 dws | dws | 
(1 row)

substr(string,from)

描述:从字符串中截取指定的子字符串。

from表示截取的起始位置。

  • from为0时,按1处理。
  • from为正数时,截取从from到末尾的所有字符。
  • from为负数时,截取字符串的后n个字符,n为from的绝对值。

返回值类型:varchar

示例:

from为0时,截取“database”从第1个字符至末尾的所有字符。

1
2
3
4
5
SELECT substr('database',0);
  substr
----------
 database
(1 row)

from为正数时,截取“database”从第5个字符至末尾的所有字符。

1
2
3
4
5
SELECT substr('database',5);
 substr
--------
 base
(1 row)

from为负数时,截取“database”从倒数第4个字符开始至末尾的所有字符。

1
2
3
4
5
SELECT substr('database',-4);
 substr
--------
 base
(1 row)

substr(string,from,count)

描述:从字符串中截取指定长度的子字符串。

from表示截取的起始位置。count表示截取的子字符串长度。

  • from为0时,按1处理。
  • from为正数时,截取从from开始的count个字符。
  • from为负数时,截取从倒数第n个开始的count个字符,n为from的绝对值。
  • count小于1时,返回null。

返回值类型:varchar

示例:

from为0时,截取“database”从第1个字符开始的4个字符。

1
2
3
4
5
SELECT substr('database',0,4);
 substr
--------
 data
(1 row)

from为正数时,截取“database”从第5个字符开始的4个字符。

1
2
3
4
5
SELECT substr('database',5,4);
 substr
--------
 base
(1 row)

from为负数时,截取“database”从倒数第4个字符开始的3个字符。

1
2
3
4
5
SELECT substr('database',-4,3);
 substr
--------
 bas
(1 row)

substrb(string,from)

描述:该函数和SUBSTR(string,from)函数功能一致,但是计算单位为字节。

返回值类型:bytea

示例:

1
2
3
4
5
SELECT substrb('ABCDEF',-2);
 substrb 
---------
 EF
(1 row)

substrb(string,from,count)

描述:该函数和SUBSTR(string,from,count)函数功能一致,但是计算单位为字节。

返回值类型:bytea

示例:

1
2
3
4
5
SELECT substrb('ABCDEF',2,2);
 substrb 
---------
 BC
(1 row)

regexp_substr(source_char, pattern)

描述:正则表达式的抽取子串函数。

返回值类型:varchar

示例:

1
2
3
4
5
SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR";
  REGEXPR_SUBSTR   
-------------------
 , Redwood Shores,
(1 row)

相关文档