2017-08-10 38 views
1

我想用REGEXP_REPLACE替換/刪除第一個連字符和3個後續字符。輸入表格不是固定長度並且變化。我想拿出一個工作明確將我想用REGEXP_REPLACE替換/刪除第一個連字符3後續字符

5F9B9C7F-ABC-40F4 
CODE-AXF 2014 CODE 
ADSHLHSALK 

預期結果的結果應該是

5F9B9C7F-ABC-40F4 ==> 5F9B9C7F-40F4 
CODE-AXF-2014 CODE ==> CODE- 2014 CODE 
ADSHLHSALK   ==> ADSHLHSALK 

查詢:

SELECT text, column 
REGEXP_REPLACE(text,'[-]',NULL) 
FROM TABLE 
where column= '5'; 
+0

的'代碼 - 2014 CODE'實際上應該是'CODE 2014 CODE'。你說你需要連同3個後續字符一起刪除連字符。 –

+0

如果您的輸入包含連字符,然後少於3個字符,該怎麼辦?如「INTRO-28」?你還想在最後刪除連字符和兩個(或一個或零)字符嗎?或者是保證不會發生在你的字符串中(而不是現在,而不是兩年後,當查詢仍然在生產中運行)? – mathguy

+0

mathguy是對的。我有一些像INTRO-28XXX一樣的entrie。在這種情況下,我想保留連字符... – kume8sit

回答

1

您可以使用

REGEXP_REPLACE('5F9B9C7F-ABC-40F4','^([^-]*)-.{3}','\1') 

如果你的意思是3 個字母,然後用[a-zA-Z]替換.

詳細

  • ^ - 串的開始
  • ([^-]*) - 第1組:比-
  • -其他任何0+字符 - 連字符
  • .{3} - 任何3個字符(或[a-zA-Z]{3}將匹配3個ASCII字母)。

看到online demo印刷

enter image description here

1

你不需要正則表達式:

SELECT text, 
     column, 
     SUBSTR(text, 1, pos - 1) || SUBSTR(text, pos + 4) 
FROM (
    SELECT text, 
     column, 
     INSTR(text, '-') AS pos 
    FROM TABLE 
    WHERE column = '5' 
); 
+0

儘管在原始問題下看到我的評論。該解決方案將從輸入「INTRO-28」中輸出「INTRO」 - 即使在短劃線之後沒有三個字符。 – mathguy

+0

@mathguy用@ CASE語句檢查連字符是否在最後3個字符中,然後在這種情況下返回原始字符串(如果它存在),可以很簡單地解決這個問題。正則表達式仍然沒有必要。 – MT0

相關問題