oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...
這個題目的確不大好寫,其實際含義基于一個場景:
比如在oracle的某張表中,有兩個字段
A1????????? B1
1???????? A,B,C,D,
2???????? E,F
假如現(xiàn)在的需求,是要統(tǒng)計A1中,每條記錄擁有多少個數(shù)目的B1,比如
A1=1的時候,其B1的字段中有4個以逗號分隔的,所以數(shù)目為4,A1=2的,有
E,F共2個,所有數(shù)目為2
而在ORACLE中,如果使用ORACLE本身的函數(shù),其實也是可以做到這個
效果的,核心是把這些逗號分隔的字符,逐一拆出來,變成一行行,上面的例子來說,
就要想辦法變成
A1?????? B1
1??????? A
1??????? B
1??????? C
1??????? D
2??????? E
2??????? F
讀者可能馬上想到,這個其實是一對多關(guān)聯(lián)關(guān)系的數(shù)據(jù)庫存儲方法,也是最常用的,
但有的時候,用A,B,C,D這樣的方式也是可以保存一對多關(guān)系的,兩種之間可以進(jìn)行轉(zhuǎn)換,
在oracle中有兩種方法實現(xiàn)。
1) oracle中的正則表達(dá)式的函數(shù)REGEXP_SUBSTR
oracle中的REGEXP_SUBSTR的用法,先介紹下:
5個參數(shù)
第一個是輸入的字符串
第二個是正則表達(dá)式
第三個是標(biāo)識從第幾個字符開始正則表達(dá)式匹配。(默認(rèn)為1)
第四個是標(biāo)識第幾個匹配組。(默認(rèn)為1)
第五個是是取值范圍:
i:大小寫不敏感;
c:大小寫敏感;
n:點號 . 不匹配換行符號;
m:多行模式;
x:擴(kuò)展模式,忽略正則表達(dá)式中的空白字符。
全部測試數(shù)據(jù)
SQL> select * from test_reg_substr;
A
-----------------------------------
ABC123XYZ
ABC123XYZ456
Edward
檢索中間的數(shù)字
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
檢索中間的數(shù)字(從第一個字母開始匹配,找第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]+');
A
------------------------------------------------------
-
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+');
A
---------------------------------------------------
-
-
Edward
更多的關(guān)于這個的介紹,可以看
http://topmanopensource.iteye.com/blog/1198638
這個文的小結(jié),小結(jié)的不錯。但要注意的是,在10G以上才支持,
方法1) 使用上面的正則,語句為
Java代碼
SELECT?distinct?A1,?REGEXP_SUBSTR(B1,?'[^,]+',?1,?LEVEL)?AS?A2
FROM?TEST
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的字段內(nèi)容為'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也是可以使用的
總結(jié)
以上是生活随笔為你收集整理的oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad2017怎么标注面积(CAD中怎么
- 下一篇: 点香烧一半,香灰都不掉怎么回事?