我有一条短信是这样的:
'a:b:c:d'
我想忽略拆分文本的最后部分,我的结果应该是
'a:b:c'
我试了split_part
次,但它不起作用,也不适用于它.
我try 过的查询都不起作用:
select split_part('a:b:c:d', ':', 1);
select reverse(split_part(reverse('a:b:c:d'), ':', -1));
我有一条短信是这样的:
'a:b:c:d'
我想忽略拆分文本的最后部分,我的结果应该是
'a:b:c'
我试了split_part
次,但它不起作用,也不适用于它.
我try 过的查询都不起作用:
select split_part('a:b:c:d', ':', 1);
select reverse(split_part(reverse('a:b:c:d'), ':', -1));
将substring()
与正则表达式一起使用:demo
select substring('a:b:c:d' FROM '^(([^:]*:){2}[^:]*)');--first 3 groups
select substring('a:b:c:d' FROM '^(.*):[^:]*');--all but the last group
它查找两组以冒号结尾的非冒号字符,然后再查找一组这样的字符.它使用POSIX syntax
^
,方括号外的意思是从头开始[^:]
表示除冒号以外的任何字符.
表示任何字符*
表示前一件事的任意数量[^:]*
表示除冒号以外的任何数量的任何值[^:]*:
的意思相同,后面跟着一个实际的冒号([^:]*:){2}
的意思相同,只是重复了两次由于PostgreSQL数组支持subscripts and slices,您也可以使用split the text into an array,使用[:3]
来获取您的前3个元素,然后是reassemble文本:
--first 3 groups
select array_to_string((string_to_array('a:b:c:d',':'))[:3],':');
--all but the last group
select reverse(array_to_string((string_to_array(reverse('a:b:c:d'),':'))[2:],':'));
你也可以按照自己的方式来做:
select reverse( substring( reverse('a:b:c:d')
from
1+position(':' in reverse('a:b:c:d') )
)
);--all but the last group
这会发现文本的反转版本中第一个冒号的位置,只保存第一个冒号之后的内容,然后再次反转.