您好,登錄后才能下訂單哦!
這篇文章主要介紹Mysql中函數(shù)如何在dm中使用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、mysql中存在FIND_IN_SET函數(shù),但是在dm中是不存在的。解決辦法手動創(chuàng)建FIND_IN_SET()函數(shù)在dm是可以實現(xiàn)的,并調(diào)用使用的。但是當(dāng)結(jié)果集比較大的時候,效率很低。數(shù)據(jù)量小的時候可以使用。當(dāng)時數(shù)據(jù)量比較大的時候使用FIND_IN_SET函數(shù),在dm使用會出現(xiàn)字符集截斷的問題?;谝陨系膯栴}。在dm使用instr()函數(shù)代替FIND_IN_SET函數(shù)??梢越鉀Q效率低和字符串截斷的問題問題。
2、mysql中存在 group_concat()函數(shù)。但在dm里是沒有的。可以使用oracle中wm_concat或者dm的LISTAGG/LISTAGG2 集函數(shù)來代替。Dm中LISTAGG/LISTAGG2 集函數(shù)和oracle中LISTAGG/LISTAGG2 集函數(shù)使用方法是一樣的。
MySQL手冊中find_in_set函數(shù)的語法解釋:
FIND_IN_SET(str,strlist)。str 要查詢的字符串 strlist 參數(shù)以,分隔的字段名 如 (1,2,6,8,10,22)查詢字段(strlist)中包含(str)的結(jié)果,返回結(jié)果為null或記錄假如字符串str在由N個子鏈組成的字符串列表strlist 中,則返回值的范圍在 1 到 N 之間 一個字符串列表就是一個由一些被 , 符號分開的子鏈組成的字符串如果第一個參數(shù)是一個常數(shù)字符串,而第二個是type SET列,則FIND_IN_SET() 函數(shù)被優(yōu)化,使用比特計算 如果str不在strlist 或strlist 為空字符串,則返回值為 0 如任意一個參數(shù)為NULL,則返回值為 NULL這個函數(shù)在第一個參數(shù)包含一個逗號(,)時將無法正常運行。
SELECT FIND_IN_SET('b', 'a,b,c,d');結(jié)果為:2因為b 在strlist集合中放在2的位置 從1開始select FIND_IN_SET('1', '1'); 返回 就是1 這時候的strlist集合有點特殊 只有一個字符串 其實就是要求前一個字符串 一定要在后一個字符串集合中才返回大于0的數(shù)。select FIND_IN_SET('2', '1,2'); 返回2 。select FIND_IN_SET('6', '1'); 返回0 strlist中不存在str,所以返回0。
create or replace function FIND_IN_SET2 ( piv_str1 varchar2, piv_str2 varchar2) return int deterministic as rt int default 0; begin with a as ( select regexp_substr(sqlstr, '[^,]+', 1, level) rval, rownum rid from ( select piv_str2 sqlstr from dual ) connect by level<=regexp_count(sqlstr, ',')+1 ) select nvl(rid, 0) into rt from dual left join ( select rid from a where rval=piv_str1 ) on 1=1; return rt; end; |
CREATE or replace FUNCTION "FIND_IN_SET"(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',') RETURN NUMBER IS l_idx number:=0; -- 用于計算piv_str2中分隔符的位置 str varchar2(500); -- 根據(jù)分隔符截取的子字符串 piv_str varchar2(500) := piv_str2; -- 將piv_str2賦值給piv_str res number:=0; -- 返回結(jié)果 loopIndex number:=0; BEGIN -- 如果piv_str中沒有分割符,直接判斷piv_str1和piv_str是否相等,相等 res=1 IF instr(piv_str, p_sep, 1) = 0 THEN IF piv_str = piv_str1 THEN res:= 1; END IF; ELSE -- 循環(huán)按分隔符截取piv_str LOOP l_idx := instr(piv_str,p_sep); loopIndex:=loopIndex+1;-- 當(dāng)piv_str中還有分隔符時 IF l_idx > 0 THEN -- 截取第一個分隔符前的字段str str:= substr(piv_str,1,l_idx-1); -- 判斷 str 和piv_str1 是否相等,相等 res=1 并結(jié)束循環(huán)判斷 IF str = piv_str1 THEN res:= loopIndex; EXIT; END IF; piv_str := substr(piv_str,l_idx+length(p_sep)); ELSE -- 當(dāng)截取后的piv_str 中不存在分割符時,判斷piv_str和piv_str1是否相等,相等 res=1 IF piv_str = piv_str1 THEN res:= loopIndex; END IF; -- 無論最后是否相等,都跳出循環(huán) EXIT; END IF; END LOOP; -- 結(jié)束循環(huán) END IF; -- 返回res RETURN res; END FIND_IN_SET; |
使用instr替代后下效果如下
使用instr替代后下效果如下
使用instr替代后下效果如下
功能:將group by產(chǎn)生的同一個分組中的值連接起來,返回一個字符串結(jié)果。
語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
說明:通過使用distinct可以排除重復(fù)值;如果希望對結(jié)果中的值進行排序,可以使用order by子句;separator是一個字符串值,缺省為一個逗號。
介紹:其函數(shù)在Oracle 10g推出,在10g版本中,返回字符串類型,在11g版本中返回clob類型。
括號里面的參數(shù)是列,而且可以是多個列的集合,也就是說在括號里面可以自由地用‘||’合并字符串。
用法1: Select aaa, wmsys.wm_concat(bbb || '(' || ccc || ')' ) from table group by aaa
用法2: Select aaa, wmsys.wm_concat(bbb || '(' || ccc || ')' ) over(partition by aaa) from table
舉例:
介紹:其函數(shù)在Oracle 11g 版本中推出,對分組后的數(shù)據(jù)按照一定的排序進行字符串連接。
其中,“[,]”表示字符串連接的分隔符,如果選擇使用[over (partition by )]則會使其變成分析函數(shù);
用法1: SELECT aaa, listagg(bbb,',') within GROUP (ORDER BY aaa) FROM table GROUP BY aaa
用法2: SELECT aaa, listagg(bbb,',') within GROUP (ORDER BY aaa) over(partition by aaa) FROM table
舉例:listagg(ORGAN_CODE, ',')within group( order by1) listagg
以上是“Mysql中函數(shù)如何在dm中使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。