ORACLE資料庫兩個字串比較

2021-10-07 08:10:46 字數 3355 閱讀 6105

oracle資料庫的兩個字段值為逗號分割的字串,例如:欄位a值為「1,2,3,5」,欄位b為「2」。

想獲取兩個欄位的交集(相同值)2,獲取兩個欄位的差集(差異值)1,3,5。

一、最終實現的sql語句

1、獲取交集(相同值):

select regexp_substr(id, '[^,]+', 1, rownum) id

from (select '1,2,3,5' id from dual)

connect by rownum <= length(regexp_replace(id, '[^,]+')) +1

intersect -- 取交集

select regexp_substr(id, '[^,]+', 1, rownum) id

from (select '2' id from dual)

connect by rownum <= length(regexp_replace(id, '[^,]+')) +1;

/*結果:2*/

2、獲取差集(差異值):

select regexp_substr(id, '[^,]+', 1, rownum) id

from (select '1,2,3,5' id from dual)

connect by rownum <= length(regexp_replace(id, '[^,]+')) +1

minus --取差集

select regexp_substr(id, '[^,]+', 1, rownum) id

from (select '2' id from dual)

connect by rownum <= length(regexp_replace(id, '[^,]+')) +1;

/*結果:13

5*/二、實現過程用到的函式用法說明

1、regexp_substr

正規表示式分割字串,函式格式如下:

function regexp_substr(strstr, pattern [,position] [,occurrence] [,modifier] [subexpression])

__srcstr:需要進行正則處理的字串

__pattern:進行匹配的正規表示式

__position:可選引數,表示起始位置,從第幾個字元開始正規表示式匹配(預設為1)

__occurrence:可選引數,標識第幾個匹配組,預設為1

__modifier:可選引數,表示模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)

使用例子:

select

regexp_substr('1,2,3,5','[^,]+') as t1,

regexp_substr('1,2,3,5','[^,]+',1,2) as t2,

regexp_substr('1,2,3,5','[^,]+',1,3) as t3,

regexp_substr('1,2,3,5','[^,]+',1,4) as t4,

regexp_substr('1,2,3,5','[^,]+',2) as t5,

regexp_substr('1,2,3,5','[^,]+',2,1) as t6,

regexp_substr('1,2,3,5','[^,]+',2,2) as t7

from dual;

/*結果:

1    2    3    5    2    2    3

*/2、regexp_replace

通過正規表示式來進行匹配替換,函式格式如下:

function regexp_substr(srcstr, pattern [,replacestr] [,position] [,occurrence] [,modifier])

__srcstr:需要進行正則處理的字串

__pattern:進行匹配的正規表示式

__replacestr:可選引數,替換的字串,預設為空字串

__position:可選引數,表示起始位置,從第幾個字元開始正規表示式匹配(預設為1)

__occurrence:可選引數,標識第幾個匹配組,預設為1

__modifier:可選引數,表示模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)

使用例子:

select

regexp_replace('1,2,3,5','5','4') t1,

regexp_replace('1,2,3,5','2|3',4) t2,

regexp_replace('1,2,3,5','[^,]+') t3,

regexp_replace('1,2,3,5','[^,]+','') t4,

regexp_replace('1,2,3,5','[^,]+','*') t5

from dual;

/*結果:

1,2,3,4    1,4,4,5    ,,,    ,,,    *,*,*,*

*/3、connect by

(1)connect by單獨用,返回多行結果

select rownum from dual connect by rownum < 5;

/*結果:12

34*/(2)一般通過start with . . . connect by . . .子句來實現sql的層次查詢

select

id,name,

sys_connect_by_path(id,'\') idpath,

sys_connect_by_path(name, '\') namepath

from (

select 1 id, '廣東' name, 0 pid from dual

union

select 2 id, '廣州' name , 1 pid from dual

union

select 3 id, '深圳' name , 1 pid from dual

)start with pid = 0

connect by prior id = pid;

/*結果:

1    廣東    \1    \廣東

2    廣州    \1\2    \廣東\廣州

3    深圳    \1\3    \廣東\深圳

*/三、總結

由上面函式用法,可知下面語句可以把字串「1,2,3,5」轉換為4行記錄

select regexp_substr(id, '[^,]+', 1, rownum) id

from (select '1,2,3,5' id from dual)

connect by rownum <= length(regexp_replace(id, '[^,]+')) +1

連線兩個字串

include include void main char lianjie char a 30 char b 30 原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 ...

交換兩個字串

交換兩個字串,原來的字串分別為 學生 和 好 字串輸出顯示為 學生好 交換後輸出顯示為 好學生 include using namespace std int main char c1 5 學生 char c2 3 好 char m,n,t m c1 n c2 cout 交換前 m n n t co...

兩個字串相乘

先附上一張演算法圖 解釋 123 456 首先拿出1和456相乘,儲存到陣列1 2 3 的位置,然後拿出2和456相乘2 3 4的位置,依次類推,直到第乙個字串遍歷完 然後將他們相加,依次存到陣列中 實現如下 int j 0 int resindex 0 for int i 0 i然後再考慮進製,需...