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 中|+=国|+=⼈