Postgres - 截断字符串

Postgres - truncate string

我有一个 Postgres 9.3 数据库,我想在 table 中整理一个名为文件名的列。当前的数据如下所示:

C:/TEST/APP/db.1.0.0-RELEASE.xml
C:/TEST/APP/db.1.0.0-RELEASE.xml
C:/USP/APP/liquibase/db.1.0.0-RELEASE.data.xml
C:/USP/APP/liquibase/db.1.0.0-RELEASE.data.xml

我想删除文件路径(可能是可变长度),这样我最终只得到文件名,例如

db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.data.xml
db.1.0.0-RELEASE.data.xml

我能看到的唯一方法是修剪最后一个 / 字符左侧的所有内容。 非常感谢任何帮助

使用regexp_replace():

select regexp_replace (t, '.*/', '')
from (
    values 
    ('C:/TEST/APP/db.1.0.0-RELEASE.xml'),
    ('C:/USP/APP/liquibase/db.1.0.0-RELEASE.data.xml')
    ) sub(t)

      regexp_replace
---------------------------
 db.1.0.0-RELEASE.xml
 db.1.0.0-RELEASE.data.xml
(2 rows)        

睡了一夜之后,我想出了一个相当简单的方法,使用 SUBSTR 使用 POSIX 正则表达式提取子字符串。

update databasechangelog
set filename = substring(filename from 'db.1.0.0-RELEASE.*')

Query returned successfully: 517 rows affected, 104 ms execution time.

我现在有一个整洁的专栏可以满足我的需要。

db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.xml
db.1.0.0-RELEASE.data.xml
db.1.0.0-RELEASE.data.xml
db.1.0.0-RELEASE.data.xml
db.1.0.0-RELEASE.data.xml

此致

您也可以使其非常通用 - 如果您不知道文件名并且只知道分隔符是 / 字符。 table 称为 databasechangelog,列名称称为 'filename'。

select split_part(filename, '/', length(filename) - length(regexp_replace(filename, '/', '', 'g')) / length('/')+1) from databasechangelog