【发布时间】: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。 -
关于通用查询如何从有其他逗号的特定位置删除字符说逗号