SQL-字符串連接聚合函數


原文:http://blog.csdn.net/java85140031/article/details/6820699

問題:  

userId  role_name         role_id 
1         管理員                 1 
1         編輯                  2 
1         超級管理員           3 
2         普通會員                4 
3         高級會員                5 
4         null                    null 
很簡單的數據,就是一個用戶可能會對應多個角色,現在要求能用程序或者sql的方式用戶和角色逗號進行分割。要求得到的數據如下: 

userId  role_name 
1        管理員,編輯,超級管理員 
2        普通會員 
3        高級會員 
4        null

 

解答:

用程序估計是再簡單不過了,數據庫的話如下:

MySQL:直接調用函數group_contact完成
oracle10g:直接掉函數wm_concat完成
oracle9i:麻煩點,不過主要是通過sys_connect_by_path,這個函數能樹枝進行按指定字符連接,之所以產生樹是因為這里面用到了Oracle的START WITH 遞歸成樹的

(1) MySQL 
group_concat函數是典型的字符串連接函數,下面就為您介紹MySQL group_concat的語法,希望對您學習

MySQL group_concat函數有所幫助。

MySQL group_concat函數
完整的語法如下:
group_concat([DISTINCT] 要連接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

我的理解就是: 后面的 group by xx 分好組之后, 然后將組內的數據連接起來,默認是逗號

測試sql語句:

1 insert into role VALUES(1,1,'管理員',1);
2 insert into role VALUES(2,1,'編輯',2);
3 insert into role VALUES(3,1,'超級管理員',3);
4 insert into role VALUES(4,2,'普通會員',4);
5 insert into role VALUES(5,3,'高級會員',5);

例子: 

select userId,group_concat(role_name,';') from role group by userId;

result: 

1  管理員;,編輯;,超級管理員;

2  普通會員;

3  高級會員;

 

擴展:

如果ORALCE\MYSQL本身有提供這字符串連接聚合函數的話,樓主這個問題,其實很容易解決的,即按USERID分組后,再將同組的role_name進行字符串連接就OVER。 
像ORALCE中wm_concat函數還不是ORACLE所有版本都有的,而像這種字符連接函數在實際編程中,是很常用的,SELECT CATSTR(role_name) FROM USER GROUP BY USERID,而這邊這個 CATSTR聚合函數是自己在數據庫PL/SQL實現的,具體實現方式可參見http://hi.baidu.com/xoy2129/blog/item/c7885e66a201f125ab184cea.html 
這樣CATSTR就具有通用性了

也就是自定義函數

參見另外一篇: oracle中用戶自己創建與調用聚合函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM