如何基于另一个regexp_replace regexp_replace?

时间:2017-08-24 11:48:07

标签: sql oracle

在表(oracle sql)中我有这样的字符串

TEXT                                     | PARAMS
random text [[aaa]], random text [[n]]*n | aaa=1,bbb=7,n=n*n

我可以将所有[[]]替换为' TEXT'与' PARAMS'? 如果可能,我认为它会像:

select regexp_replace('[[aaa]]', '[[.*]]', regexp_substr('aaa=1', '\1')) from dual;

任何人都可以解释如何在没有PLSQL的情况下做到这一点吗?

1 个答案:

答案 0 :(得分:0)

只需使用REPLACESUBSTRINSTR函数 - 如果使用正则表达式,则还需要在替换参数中转义在正则表达式中具有特殊含义的字符。

示例数据

CREATE TABLE inputs ( text, params ) AS
  SELECT 'random text [[aaa]], random text [[n]]*n', 'aaa=1,bbb=7,n=n*n' FROM DUAL;

<强>查询

WITH replacement ( text, params, idx ) AS (
  SELECT REPLACE(
           text,
           '[[' || SUBSTR( params, 1, INSTR( params, '=', 1 ) - 1 ) || ']]',
           CASE INSTR( params, ',', 1 )
             WHEN 0
             THEN SUBSTR( params, INSTR( params, '=', 1 ) + 1 )
             ELSE SUBSTR( params, INSTR( params, '=', 1 ) + 1, INSTR( params, ',', 1 ) - INSTR( params, '=', 1 ) - 1 )
           END
         ),
         params,
         INSTR( params, ',', 1 ) + 1
  FROM   inputs
UNION ALL
  SELECT REPLACE(
           text,
           '[[' || SUBSTR( params, idx, INSTR( params, '=', idx ) - idx ) || ']]',
           CASE INSTR( params, ',', idx )
             WHEN 0
             THEN SUBSTR( params, INSTR( params, '=', idx ) + 1 )
             ELSE SUBSTR( params, INSTR( params, '=', idx ) + 1, INSTR( params, ',', idx ) - INSTR( params, '=', idx ) - 1 )
           END
         ),
         params,
         INSTR( params, ',', idx ) + 1
  FROM   replacement
  WHERE  idx > 1
)
SELECT text
FROM   replacement
WHERE  idx = 1;

<强>输出

TEXT
--------------------------------
random text 1, random text n*n*n