【问题标题】:Oracle SQL -- remove partial duplicate from stringOracle SQL——从字符串中删除部分重复
【发布时间】:2013-08-30 16:32:55
【问题描述】:

我有一个表格,其中有一列字符串如下所示:

static-text-here/1abcdefg1abcdefgpxq

从这个字符串1abcdefg 重复两次,所以我想删除那个部分字符串,然后返回:

static-text-here/1abcdefgpxq

我不能保证重复字符串的长度。在纯 SQL 中,如何进行这种操作?

【问题讨论】:

  • 如果有多次重复怎么办?像aaaaa 这样的东西呢?是aa 两次后跟a(导致aaa)还是a 重复5 次,导致a
  • @m.buettner 没有多次重复。 “重复的字符串”紧随静态文本之后开始,并且只重复一次。

标签: sql regex oracle


【解决方案1】:
regexp_replace('static-text-here/1abcdefg1abcdefgpxq', '/(.*)\1', '/\1')

fiddle

【讨论】:

【解决方案2】:

如果你能保证重复字符串的最小长度,这样的事情会起作用:

select REGEXP_REPLACE
   (input, 
   '(.{10,})(.*?)\1+', 
   '\1') "Less one repetition" 
   from tablename tn where ...;

我相信这可以通过一些巧妙的方式扩展以满足您的情况。

【讨论】:

    【解决方案3】:

    在我看来,您可能正在推动 SQL 超出其能力/设计的范围。您是否可以在位于数据层下方的层中以编程方式处理这种情况,这样可以更轻松地处理此类事情?

    【讨论】:

      【解决方案4】:

      REPLACE 函数应该足以解决问题。

      测试表:

      CREATE TABLE test (text varchar(100));
      
      INSERT INTO test (text) VALUES ('pxq');
      INSERT INTO test (text) VALUES ('static-text-here/pxq');
      INSERT INTO test (text) VALUES ('static-text-here/1abcdefgpxq');
      INSERT INTO test (text) VALUES ('static-text-here/1abcdefg1abcdefgpxq');
      

      查询:

      SELECT text, REPLACE(text, '1abcdefg1abcdefg', '1abcdefg') AS text2
      FROM test;
      

      结果:

      TEXT                                    TEXT2
      pxq                                     pxq
      static-text-here/pxq                    static-text-here/pxq
      static-text-here/1abcdefgpxq            static-text-here/1abcdefgpxq
      static-text-here/1abcdefg1abcdefgpxq    static-text-here/1abcdefgpxq
      

      AFAIK REPLACE 函数不在 SQL99 标准中,但大多数 DBMS 都支持它。我测试了它here,它适用于 MySQL、PostgreSQL、SQLite、Oracle 和 MS SQL Server。

      【讨论】:

      • 你在这里硬编码重复的字符串,虽然它可以是任何重复的字符串。
      • @Jerry 我明白了。所以 REPLACE 只有在只有少数可能的字符串可以是重复的子字符串,并且所有这些都是预先知道的情况下才足够。
      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2017-03-01
      • 1970-01-01
      • 2021-04-13
      • 2020-11-16
      • 2016-05-21
      • 2012-08-15
      • 1970-01-01
      相关资源
      最近更新 更多