我有一条短信是这样的:

'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

这会发现文本的反转版本中第一个冒号的位置,只保存第一个冒号之后的内容,然后再次反转.

Postgresql相关问答推荐

Postgres BULK INSERT如何影响Debezium?

端口5432失败:致命:数据库xxx&不存在.在PostgreSQL数据库中

无法在timscaleDb中创建Hypertable

如何在PostgreSQL中以行值的形式获取列

Pogresql性能中的枚举与文本数据类型

列索引8上的扫描错误,名称已复制:不支持扫描,正在存储驱动程序.值类型[]uint8到类型*[]*bool

执行准备好的语句不返回数据

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

ST_Intersects 太慢

@符号在yacc中的函数中是什么意思

在 SQL 上返回负值

为什么 postgresql 可以在这个查询中高效地使用索引?

PostgreSQL:please specify covering index name是什么意思

knex: Select 特定日期范围内的行

如何让 Rails 使用 SSL 连接到 PostgreSQL?

从 psycopg2 异常中获取错误消息

将 SELECT 结果作为参数传递给 postgreSQL 函数

如何使用 PostgreSQL 触发器来存储更改(SQL 语句和行更改)

pg_restore 会覆盖现有的表吗?

使用 Postgres 在 Rust 的 Diesel 库中添加时间戳