您好,登錄后才能下訂單哦!
這篇文章主要介紹Mysql中函數如何在dm中使用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、mysql中存在FIND_IN_SET函數,但是在dm中是不存在的。解決辦法手動創建FIND_IN_SET()函數在dm是可以實現的,并調用使用的。但是當結果集比較大的時候,效率很低。數據量小的時候可以使用。當時數據量比較大的時候使用FIND_IN_SET函數,在dm使用會出現字符集截斷的問題。基于以上的問題。在dm使用instr()函數代替FIND_IN_SET函數。可以解決效率低和字符串截斷的問題問題。
2、mysql中存在 group_concat()函數。但在dm里是沒有的。可以使用oracle中wm_concat或者dm的LISTAGG/LISTAGG2 集函數來代替。Dm中LISTAGG/LISTAGG2 集函數和oracle中LISTAGG/LISTAGG2 集函數使用方法是一樣的。
MySQL手冊中find_in_set函數的語法解釋:
FIND_IN_SET(str,strlist)。str 要查詢的字符串 strlist 參數以,分隔的字段名 如 (1,2,6,8,10,22)查詢字段(strlist)中包含(str)的結果,返回結果為null或記錄假如字符串str在由N個子鏈組成的字符串列表strlist 中,則返回值的范圍在 1 到 N 之間 一個字符串列表就是一個由一些被 , 符號分開的子鏈組成的字符串如果第一個參數是一個常數字符串,而第二個是type SET列,則FIND_IN_SET() 函數被優化,使用比特計算 如果str不在strlist 或strlist 為空字符串,則返回值為 0 如任意一個參數為NULL,則返回值為 NULL這個函數在第一個參數包含一個逗號(,)時將無法正常運行。
SELECT FIND_IN_SET('b', 'a,b,c,d');結果為:2因為b 在strlist集合中放在2的位置 從1開始select FIND_IN_SET('1', '1'); 返回 就是1 這時候的strlist集合有點特殊 只有一個字符串 其實就是要求前一個字符串 一定要在后一個字符串集合中才返回大于0的數。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); -- 根據分隔符截取的子字符串 piv_str varchar2(500) := piv_str2; -- 將piv_str2賦值給piv_str res number:=0; -- 返回結果 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 -- 循環按分隔符截取piv_str LOOP l_idx := instr(piv_str,p_sep); loopIndex:=loopIndex+1;-- 當piv_str中還有分隔符時 IF l_idx > 0 THEN -- 截取第一個分隔符前的字段str str:= substr(piv_str,1,l_idx-1); -- 判斷 str 和piv_str1 是否相等,相等 res=1 并結束循環判斷 IF str = piv_str1 THEN res:= loopIndex; EXIT; END IF; piv_str := substr(piv_str,l_idx+length(p_sep)); ELSE -- 當截取后的piv_str 中不存在分割符時,判斷piv_str和piv_str1是否相等,相等 res=1 IF piv_str = piv_str1 THEN res:= loopIndex; END IF; -- 無論最后是否相等,都跳出循環 EXIT; END IF; END LOOP; -- 結束循環 END IF; -- 返回res RETURN res; END FIND_IN_SET; |
使用instr替代后下效果如下
使用instr替代后下效果如下
使用instr替代后下效果如下
功能:將group by產生的同一個分組中的值連接起來,返回一個字符串結果。
語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
說明:通過使用distinct可以排除重復值;如果希望對結果中的值進行排序,可以使用order by子句;separator是一個字符串值,缺省為一個逗號。
介紹:其函數在Oracle 10g推出,在10g版本中,返回字符串類型,在11g版本中返回clob類型。
括號里面的參數是列,而且可以是多個列的集合,也就是說在括號里面可以自由地用‘||’合并字符串。
用法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
舉例:
介紹:其函數在Oracle 11g 版本中推出,對分組后的數據按照一定的排序進行字符串連接。
其中,“[,]”表示字符串連接的分隔符,如果選擇使用[over (partition by )]則會使其變成分析函數;
用法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中函數如何在dm中使用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。