在表(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的情况下做到这一点吗?
答案 0 :(得分:0)
只需使用REPLACE
,SUBSTR
和INSTR
函数 - 如果使用正则表达式,则还需要在替换参数中转义在正则表达式中具有特殊含义的字符。
示例数据:
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