日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...

發布時間:2024/10/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 正则表达式拆分字符串,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;

A

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

ABC123XYZ

ABC123XYZ456

Edward

檢索中間的數字

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]+');

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

更多的關于這個的介紹,可以看

http://topmanopensource.iteye.com/blog/1198638

這個文的小結,小結的不錯。但要注意的是,在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的字段內容為'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也是可以使用的

總結

以上是生活随笔為你收集整理的oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。