溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql中函數(shù)如何在dm中使用

發(fā)布時間:2021-11-11 10:57:59 來源:億速云 閱讀:508 作者:小新 欄目:數(shù)據(jù)庫

這篇文章主要介紹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ù)使用方法是一樣的。

二、FIND_IN_SET函數(shù)

1、Mysql的定義:

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。

2、自定義的find_in_set()

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;

3、網(wǎng)上配置在oracle中的find_in_set()函數(shù)定義

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;

4、函數(shù)調(diào)用案例find_in_set()進行查詢數(shù)據(jù),報字符串截斷。

使用instr替代后下效果如下

使用instr替代后下效果如下

Mysql中函數(shù)如何在dm中使用

使用instr替代后下效果如下

Mysql中函數(shù)如何在dm中使用

Mysql中函數(shù)如何在dm中使用

三、group_concat()函數(shù)

1、mysql中g(shù)roup_concat()函數(shù)的定義

功能:將group by產(chǎn)生的同一個分組中的值連接起來,返回一個字符串結(jié)果。

語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

說明:通過使用distinct可以排除重復(fù)值;如果希望對結(jié)果中的值進行排序,可以使用order by子句;separator是一個字符串值,缺省為一個逗號。

 Mysql中函數(shù)如何在dm中使用

2、在dm用wm_concat或者dm的LISTAGG/LISTAGG2 集函數(shù)

1、wm_concat

介紹:其函數(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

舉例:

Mysql中函數(shù)如何在dm中使用

Mysql中函數(shù)如何在dm中使用

2、LISTAGG() 簡介

介紹:其函數(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中使用

以上是“Mysql中函數(shù)如何在dm中使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(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)容。

AI