【问题标题】:Postgres - truncate stringPostgres - 截断字符串
【发布时间】:2015-12-14 18:38:20
【问题描述】:

我有一个 Postgres 9.3 数据库,我想整理表格中名为 filename 的列。目前的数据如下所示:

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

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

【问题讨论】:

    标签: postgresql truncate


    【解决方案1】:

    你也可以让它非常通用 - 如果你不知道文件名并且只知道分隔符是 / 字符。该表称为databasechangelog,列名称为“文件名”。

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

    【讨论】:

    • 你有更好的通用解决方案,regexp_replace() 在我的回答中。试试:select regexp_replace(filename, '.*/', '') from databasechangelog.
    【解决方案2】:

    睡了一夜之后,我想出了一个相当简单的方法,使用 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
    

    问候

    【讨论】:

      【解决方案3】:

      使用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)        
      

      【讨论】:

        猜你喜欢
        • 2016-01-06
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        相关资源
        最近更新 更多