只需使用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
是的,但你怎麼能知道有多少嵌套更換要做什麼?你可能不能。但是用Java或類似的工具來做這件事相當簡單。我寧願在數據庫之外進行這種類型的數據清理。 –
@TimBiegeleisen是的,我不知道有多少嵌套替換,所以我在這裏問如何做到這一點。是的,我知道如何在php/java/python上執行1001方法,但在這種情況下,我應該只使用SQL。這不是我的選擇:) – newSqlz
Upvoted幫助你獲得答案+1。 –