Mysql中函数如何在dm中使用

63次阅读
没有评论

共计 3326 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要介绍 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 集函数使用方法是一样的。

二、FIND_IN_SET 函数 1、Mysql 的定义:

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。

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、网上配置在 oracle 中的 find_in_set()函数定义

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;

4、函数调用案例 find_in_set()进行查询数据,报字符串截断。

使用 instr 替代后下效果如下

使用 instr 替代后下效果如下

使用 instr 替代后下效果如下

三、group_concat()函数
1、mysql 中 group_concat() 函数的定义

功能:将 group by 产生的同一个分组中的值连接起来,返回一个字符串结果。

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

说明:通过使用 distinct 可以排除重复值;如果希望对结果中的值进行排序,可以使用 order by 子句;separator 是一个字符串值,缺省为一个逗号。

 

2、在 dm 用 wm_concat 或者 dm 的 LISTAGG/LISTAGG2
集函数 1、wm_concat

介绍:其函数在 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

举例:

2、LISTAGG() 简介

介绍:其函数在 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 中使用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计3326字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)