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然後再考慮進製,需...