【问题标题】:Replace character at a given position in oracle替换oracle中给定位置的字符
【发布时间】:2020-07-19 05:51:46
【问题描述】:

假设我有一个 16k 字符的字符串,它可能在许多位置包含一个逗号 (,) 但我只想用 null 替换 4001,8001,12001 位置的逗号(,)

在其他位置可能有逗号(,),例如 4002,不应替换。

下面的示例数据

        WITH data
         AS (SELECT To_clob(Lpad('A', 4000, '0'))
                    ||To_clob(Lpad('A', 4000, '0'))
                    ||To_clob(Lpad('A', 4000, '0'))
                    ||To_clob(Lpad('A', 4000, '0'))
                    ||To_clob(Lpad('A', 4000, '0')) AS file_data
             FROM   dual),
         data1
         AS (SELECT LEVEL
                    lvl
                    ,
                    Substr(file_data, Decode(LEVEL, 1, LEVEL,
                                                    ( ( LEVEL - 1 ) * 4000 ) + 1),
                    4000)
                       file_data,
                    1
                       order1
             FROM   data
             CONNECT BY ( ( LEVEL - 1 ) * 4000 ) + 4000 <= Length(file_data))
    SELECT Wm_concat(To_clob(file_data)) file_data
    FROM   data1; 

【问题讨论】:

  • 用什么替换?在哪里 - 在一张桌子上?仅在查询的输出中?然后 - 是否保证输入是 16k 个字符,并且位置 4001、8001、12001 有逗号 - 还是必须先检查这些?
  • 只在查询的输出中替换为null,不保证输入为16k且每4000+1个位置的倍数处有逗号
  • wm_concat 从未被记录(因此受到支持),并且在我的版本 12.2 上,它无法识别。但是,如果它对您有用,这里有一个可能的方法:将输入分成 4000 个字符块;然后,对于每一块,计算nullif(substr(piece, 1, 1), ',') || substr(piece, 2);然后在这些结果上调用wm_concat
  • 关于通用查询如何从有其他逗号的特定位置删除字符说逗号

标签: sql regex oracle replace


【解决方案1】:

您可以使用REGEX_REPLACE 替换特定位置的字符。

SELECT 
    REGEXP_REPLACE('This,is,mystring,with,16kchars,imtrying,toreplace,comma,at30th,position','(^.{30})(.{1})(.*)$','\1\3') 
FROM dual; 

输出。

 This,is,mystring,with,16kcharsimtrying,toreplace,comma,at30th,position

您可以相应地更改您的位置。但这并不特定于逗号。它用给定位置替换任何东西

【讨论】:

  • 如果我想替换怎么办;与 null 并且还 ;用逗号
  • 如果要将逗号替换为;而不是null,请将最后一部分更改为'\1;\3'
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2011-02-24
相关资源
最近更新 更多