截取字符串
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) |