2017-08-24 103 views
1

在表(的Oracle SQL)1具有這樣的字符串如何regexp_replace基於另一個regexp_replace?

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

我可以取代所有[[]]從具有 'PARAMS' 'TEXT'? 如果有可能,我認爲它會像:

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

有誰能夠解釋我應該怎麼做沒有PLSQL?

+1

是的,但你怎麼能知道有多少嵌套更換要做什麼?你可能不能。但是用Java或類似的工具來做這件事相當簡單。我寧願在數據庫之外進行這種類型的數據清理。 –

+0

@TimBiegeleisen是的,我不知道有多少嵌套替換,所以我在這裏問如何做到這一點。是的,我知道如何在php/java/python上執行1001方法,但在這種情況下,我應該只使用SQL。這不是我的選擇:) – newSqlz

+0

Upvoted幫助你獲得答案+1。 –

回答

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 
+0

偉大的thnx! :-) – newSqlz

+0

,我有另一個類似的情況,但在另一個表中的參數:CREATE TABLE inputs(text)AS SELECT'random text << >> blablabla << >>'FROM DUAL; CREATE TABLE PARAMS(名稱,值) SELECT 'AAA', 'QQQ' FROM DUAL UNION ALL SELECT 'BBB', 'WWW' FROM DUAL ; ///你能證明在這種情況下它將如何? – newSqlz

+0

@newSqlz你會更好地問這是一個新問題,因爲答案會與這個答案有很大的不同,從而在單個答案中造成混淆。 – MT0