SQL-字符串连接聚合函数

更新时间:2023-07-06 12:10:18 阅读: 评论:0

SQL-字符串连接聚合函数
来⾃:
问题:
urId  role_name        role_id
1        管理员                1
1        编辑                  2
1        超级管理员           3
2        普通会员                4
3        ⾼级会员                5
4        null                    null
很简单的数据,就是⼀个⽤户可能会对应多个⾓⾊,现在要求能⽤程序或者sql的⽅式⽤户和⾓⾊逗号进⾏分割。要求得到的数据如下:
urId  role_name
1        管理员,编辑,超级管理员
2        普通会员
3        ⾼级会员
4        null
解答:
⽤程序估计是再简单不过了,的话如下:
:直接调⽤函数group_contact完成
oracle10g:直接掉函数wm_concat完成
oracle9i:⿇烦点,不过主要是通过sys_connect_by_path,这个函数能树枝进⾏按指定字符连接,之所以产⽣树是因为这⾥⾯⽤到了的START WITH 递归成树的
(1) MySQL分组字符串拼接
stop是什么意思
group_concat函数是典型的字符串连接函数,下⾯就为您介绍MySQL group_concat的语法,希望对您学习
MySQL group_concat函数有所帮助。
MySQL group_concat函数
完整的语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
我的理解就是: 后⾯的 group by xx 分好组之后, 然后将组内的数据连接起来,默认是逗号
测试sql语句:
inrt into role VALUES(1,1,'管理员',1);
inrt into role VALUES(2,1,'编辑',2);
inrt into role VALUES(3,1,'超级管理员',3);
inrt into role VALUES(4,2,'普通会员',4);
inrt into role VALUES(5,3,'⾼级会员',5);
例⼦:
lect urId,group_concat(role_name,';') from role group by urId;
result:
1  管理员;,编辑;,超级管理员;
2  普通会员;
3  ⾼级会员;
(1) oracle分组字符串拼接
jeclect grp, wmsys.wm_concat(str)
from (lect 1 grp, 'a1' str
from dual
union
lect 1 grp, 'a2' str
hotlist
from dual
信息工程就业前景union
lect 2 grp, 'b1' str
from dual
union
lect 2 grp, 'b2' str
from dual
union
lect 2 grp, 'b3' str from dual) t
group by grp
执⾏效果:
原始数据分组聚合后
注意事项:
解决⽅案:
1. 升级到Oracle 11g Relea 2,此版本引⼊了LISTAGG 函数,使得聚集连接字符串变得很容易,并且允许使⽤我们指定连接串中的字段顺序。
2. ⽤⾃⼰定义的聚合函数替换wmsys.wm_concat
代码如下:
-- 1. 建⽴测试表和数据:
CREATE TABLE WM_TEST
(
CODE  INTEGER,
NAME  VARCHAR2(20 BYTE)
);
Inrt into WM_TEST (CODE, NAME) Values (1, 'a');
Inrt into WM_TEST (CODE, NAME) Values (1, 'b');
Inrt into WM_TEST (CODE, NAME) Values (1, 'c');
Inrt into WM_TEST (CODE, NAME) Values (2, '中');
Inrt into WM_TEST (CODE, NAME) Values (2, '国');
Inrt into WM_TEST (CODE, NAME) Values (2, '⼈');
COMMIT;
-- 2. 建⽴⾃定义聚合函数
CREATE OR REPLACE TYPE ConcatObj AS OBJECT
(
(
补习班名字
fieldValue VARCHAR2 (4000),
parator VARCHAR2 (100)
)
/
CREATE OR REPLACE TYPE type_wm_concat
单眼皮眼线膏的画法
AS OBJECT
(
l_join_str VARCHAR2 (32767 BYTE),                                -- 连接后的字符串gazette
l_flag VARCHAR2 (100 BYTE),                            -- 分隔符,默认值可在body中定义
STATIC FUNCTION ODCIAggregateInitialize                              -- 初始化
(sctx IN OUT type_wm_concat)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate                          -- 迭代器,处理每⾏数据                                        (lf    IN OUT type_wm_concat,
VALUE  IN    ConcatObj)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate                        -- 迭代结束后处理代码                                          (lf      IN OUT type_wm_concat,
return_v      OUT VARCHAR2,
flags      IN    NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge                                  -- 结果合并
(lf  IN OUT type_wm_concat,
ctx2  IN    type_wm_concat)
RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY type_wm_concat
IS
STATIC FUNCTION ODCIAggregateInitialize                              -- 初始化
(sctx IN OUT type_wm_concat)
RETURN NUMBER
IS
BEGIN
cqltsctx := type_wm_concat (NULL, NULL);
RETURN ODCIConst.success;be able to
END ODCIAggregateInitialize;
MEMBER FUNCTION ODCIAggregateIterate                          -- 迭代器,处理每⾏数据                                        (lf    IN OUT type_wm_concat,
VALUE  IN    ConcatObj)
RETURN NUMBER
IS
BEGIN
IF lf.l_join_str IS NOT NULL AND VALUE.fieldValue IS NOT NULL
THEN
lf.l_join_str := lf.l_join_str || lf.l_flag || VALUE.fieldValue;
ELSIF VALUE.fieldValue IS NOT NULL
harry houdiniTHEN
lf.l_join_str := VALUE.fieldValue;
lf.l_flag := VALUE.parator;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate                        -- 迭代结束后处理代码                                          (lf      IN OUT type_wm_concat,
return_v      OUT VARCHAR2,
flags      IN    NUMBER)
RETURN NUMBER
RETURN NUMBER
IS
BEGIN
return_v := lf.l_join_str;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge (lf  IN OUT type_wm_concat,                                      ctx2  IN    type_wm_concat)
RETURN NUMBER
IS
BEGIN
IF ctx2.l_join_str IS NOT NULL AND lf.l_join_str IS NOT NULL
THEN
lf.l_join_str := lf.l_join_str || lf.l_flag || ctx2.l_join_str;
ELSIF ctx2.l_join_str IS NOT NULL
THEN
lf.l_join_str := ctx2.l_join_str;
END IF;
RETURN ODCIConst.Success;
END;
END;
/
-- 3. 封装为⼀个普通的SQL函数:
CREATE OR REPLACE FUNCTION my_wm_concat (pi_str ConcatObj)
RETURN VARCHAR2
PARALLEL_ENABLE
AGGREGATE USING type_wm_concat;
/
-
- 4. 测试:
de, my_wm_concat (ConcatObj (wt.name, '|+=')) names
FROM wm_test wt
GROUP de;
code name
1    a|+=b|+=c
2    中|+=国|+=⼈

本文发布于:2023-07-06 12:10:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1081729.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   连接   字符串
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图