oracle中經過正則表達式函數處理逗號分隔的字段

這個題目的確不大好寫,其實際含義基於一個場景: 

好比在oracle的某張表中,有兩個字段 

A1          B1 
1         A,B,C,D, 
2         E,F 
   假如如今的需求,是要統計A1中,每條記錄擁有多少個數目的B1,好比 
A1=1的時候,其B1的字段中有4個以逗號分隔的,因此數目爲4,A1=2的,有 
E,F共2個,全部數目爲2 
    而在ORACLE中,若是使用ORACLE自己的函數,其實也是能夠作到這個 
效果的,核心是把這些逗號分隔的字符,逐一拆出來,變成一行行,上面的例子來講, 
就要想辦法變成 


  A1       B1 
  1        A 
  1        B 
  1        C 
  1        D 
  2        E 
  2        F 
  
  讀者可能立刻想到,這個實際上是一對多關聯關係的數據庫存儲方法,也是最經常使用的, 
但有的時候,用A,B,C,D這樣的方式也是能夠保存一對多關係的,兩種之間能夠進行轉換, 
在oracle中有兩種方法實現。 

1) oracle中的正則表達式的函數REGEXP_SUBSTR 
   oracle中的REGEXP_SUBSTR的用法,先介紹下: 

5個參數 
第一個是輸入的字符串 
第二個是正則表達式 
第三個是標識從第幾個字符開始正則表達式匹配。(默認爲1) 
第四個是標識第幾個匹配組。(默認爲1) 
第五個是是取值範圍: 
i:大小寫不敏感; 
c:大小寫敏感; 
n:點號 . 不匹配換行符號; 
m:多行模式; 
x:擴展模式,忽略正則表達式中的空白字符。 

所有測試數據 
SQL> select * from test_reg_substr; 

----------------------------------- 
ABC123XYZ 
ABC123XYZ456 
<Name>Edward</Name> 

檢索中間的數字 
SQL> SELECT 
2    REGEXP_SUBSTR(a,'[0-9]+') 
3  FROM 
4    test_reg_substr 
5  WHERE 
6    REGEXP_LIKE(a, '[0-9]+'); 
REGEXP_SUBSTR(A,'[0-9]+') 
--------------------------------- 
123 
123 

檢索中間的數字(從第一個字母開始匹配,找第2個匹配項目) 
SQL> SELECT 
2    NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a 
3  FROM 
4    test_reg_substr 
5  WHERE 
6    REGEXP_LIKE(a, '[0-9]+'); 

------------------------------------------------------ 

456 

取得「字符集合」 
SQL> SELECT 
2    REGEXP_SUBSTR(a, '\w+') 
3  FROM 
4    test_reg_substr 
  5  WHERE 
6    REGEXP_LIKE(a, '\w+'); 
REGEXP_SUBSTR(A,'\W+') 
------------------------------- 
ABC123XYZ 
ABC123XYZ456 
Name 

取得「字符集合」(從第一個字母開始匹配,找第2個匹配項目) 
SQL> SELECT 
2    NVL(REGEXP_SUBSTR(a, '\w+',1, 2), '-') AS a 
3  FROM 
4    test_reg_substr 
  5  WHERE 
6    REGEXP_LIKE(a, '\w+'); 

--------------------------------------------------- 


Edward 


  更多的關於這個的介紹,能夠看 
http://topmanopensource.iteye.com/blog/1198638 
這個文的小結,小結的不錯。但要注意的是,在10G以上才支持, 


方法1) 使用上面的正則,語句爲 
   
  
Java代碼 
  1. SELECT distinct A1, REGEXP_SUBSTR(B1, '[^,]+'1, LEVEL) AS A2  
  2.    FROM TEST  
  3.    CONNECT BY LEVEL <= LENGTH(B1)-LENGTH(REPLACE(B1, ','))+1)  




方法2) 

select a1, substr(b1, 0, instr(b1, ',')) from 
test union select a1, substr(b1, instr(b1, ',')+1,length(b1)) 
from test 

方法3 
   使用SQL,首先在b1字段後面添加一個逗號,好比 
要某條記錄中B1的字段內容爲'duan,shao,chu,tian' 

SELECT L_COUNT, 
       SUBSTR('duan,shao,chu,tian' || ',', 
              INSTR('duan,shao,chu,tian' || ',', 
                    ',', 
                    L_COUNT - 1, 
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) + 1, 
              INSTR('duan,shao,chu,tian' || ',', 
                    ',', 
                    1, 
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1) + 1) - 
              INSTR('duan,shao,chu,tian' || ',', 
                    ',', 
                    1, 
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) - 1) AS RS 
  FROM DUAL, 
       (SELECT LEVEL L_COUNT 
          FROM DUAL 
        CONNECT BY LEVEL < 
                   LENGTH('duan,shao,chu,tian' || ',') - 
                   LENGTH(REPLACE('duan,shao,chu,tian' || ',', ',', '')) + 1); 
  其中2,3方法對oracle 9i也是能夠使用的
相關文章
相關標籤/搜索