共计 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 行业资讯频道!