2013-08-02 90 views
1

我有一個字符串像提取一定的規律與Oracle SQL

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual) 
select * from xx 

有一些thosand行類似下面的

 IDNO |        TEST 
     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
     id9 | untest X456789,W357987 and Q321089 cont group 

我想提取與一個字母后跟6開頭的單詞數字。此外,應該有它們之間用逗號(因爲以後我將它們放置到多個行)

結果表:

 IDNO |    TEST 
     +++++++++++++++++++++++++++++++++++++++++ 
     id9 | X456789,X321678,W357987,Q321089 

我已經試過regexp_replace,但未能達成一個解決方案。

select idno, REGEXP_replace(test,'([^[A-Z]{1}[:digit:]{6},?])') AS test from xx 
+0

你確定你的數據庫是正常的嗎? –

+0

這是一個有目的地非規範化的OLAP環境。 (少連接,更乾淨的代碼)。上表是從第三方機構收到的,不幸的是我們根本沒有機會根據我們的需求進行格式化。 – bonsvr

+0

沒關係,只要它是有意的,而不是對標準化的理解不夠。祝你好運! :) –

回答

4

下你想要做什麼你的原始字符串:

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual 
) 
select idno, 
     REGEXP_replace(test, 
         '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1' 
        ) AS test 
from xx; 

獲取第二空間是一個逗號。 。 。您可以使用常規替換:

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual 
) 
select idno, 
     replace(REGEXP_replace(test, 
           '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1' 
          ), 
       ' ', ',') AS test 
from xx; 

SQL小提琴是here

+0

Linoff先生,第一個查詢沒有改變原始字符串。第二個只是在所有單詞之間插入逗號。 – bonsvr

+0

http://sqlfiddle.com/#!4/d41d8/15290 – bonsvr

+0

@bonsvr。 。 。我爲此道歉。我使用SQL Fiddle工作,顯然將錯誤的查詢複製回答案。固定。 –