oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法

1、oracle函数 WMSYS.WM_CONCAT的使用

如图,将图1的结果变成图2的结果,使用函数 WMSYS.WM_CONCAT 即可。

查询语句需要配合使用group by

select aa,wmsys.wm_concat(t1.name) from (
select t.name,to_char(t.createdate,'yyyy-mm-dd') aa from td_user t where t.td_conference_id = 3218 and t.status = 1 and t.createdate > to_date('2012-10-28','yyyy-mm-dd') order by createdate desc
) t1 group by t1.aa

图1:

图2:

2、mysql 函数 GROUP_CONCAT 的使用

GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUPBY一起用,具体可参考MySQL官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

完整的语法如下:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

基本查询
mysql> select * from aa;
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200  |
|3 | 500  |
+------+------+
6 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,逗号分隔(默认)
mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
3 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,分号分隔
mysql> select id,group_concat(name separator ';') from aa group by id;
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500  |
+------+----------------------------------+
3 rows in set (0.00 sec)

以id分组,把去冗余的name字段的值打印在一行,
逗号分隔

mysql> select id,group_concat(distinct name) from aa group by id;
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20  |
|3 | 200,500 |
+------+-----------------------------+
3 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
mysql> select id,group_concat(name order by name desc) from aa group by id;
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10  |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
3 rows in set (0.00 sec)

需要注意的:

a.int字段的连接陷阱

当你用group_concat的时候请注意,连接起来的字段如果是int型,一定要转换成char再拼起来,
否则在你执行后(ExecuteScalar或者其它任何执行SQL返回结果的方法)返回的将不是一个逗号隔开的串,
而是byte[]。

该问题当你在SQLyog等一些工具中是体现不出来的,所以很难发现。

select group_concat(ipaddress) from t_ip返回逗号隔开的串
select group_concat(id) from t_ip 返回byte[]
select group_concat(CAST(id as char)) from t_dep返回逗号隔开的串
select group_concat(Convert(id , char)) from t_dep返回逗号隔开的串

附Cast,convert的用法:
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USINGtranscoding_name)
CAST() 和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。

这个类型 可以是以下值其中的 一个:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

b.长度陷阱
用了group_concat后,select里如果使用了limit是不起作用的.
用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。

使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val是一个无符号整数:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度,则结果被截至这个最大长度。

在SQLyog中执行 SET GLOBAL group_concat_max_len = 10后,重新打开SQLyog,设置就会生效。

时间: 2024-12-27 21:12:52

oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法的相关文章

oracle中WMSYS.WM_CONCAT不出现在12c中解决办法

WMSYS.WM_CONCAT不出现在12c中,原因是WMSYS.WM_CONCAT是一个oracle supported的internal函数,是在oracle workspace manager组件(wmsys用户)中包含的,这个函数是for workspace manager内部使用. 这意味着一般应用程序不建议去调用这个函数,因为这个函数可能会因为版本升级,或者需要优化性能等等其他的原因,oracle开发可以在不通知用户的情况下,修改或者取消这个函数. 所以不建议在application

oracle—SQL技巧之(二)WMSYS.WM_CONCAT函数实现多行记录用逗号拼接在一起_oracle

需求: 目前接触BI系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式. 解决方案:使用Oracle自带的函数 WMSYS.WM_CONCAT,进行拼接. 函数限制:它的输出不能超过4000个字节. 为了不让SQL出错,又可以满足业务的需求,超过4000个字节的部分,使用"..." 实现SQL如下: 复制代码 代码如下: CREATE TABLE TMP_PRODUCT (PRODUCT_TYPE

[141204]11G关于使用wmsys.wm_concat的问题

[20141204]11G关于使用wmsys.wm_concat的问题.txt --今天开发提示一些sql语句在dataguard查询时报错,因为dataguard是read only打开,一些dml语句是不支持的, --没看语句之前,以为是语句里面使用sequence,仔细检查发现没有,而发现使用了wmsys.wm_concat. --使用wmsys.wm_concat对象实现行列转换. --感到奇怪的是在我搭建的测试环境没有问题,能正常执行. SCOTT@test> @ver1 PORT_S

详解MySQL中UNION的用法_Mysql

如果想选择其他几个表中的行或从一个单一的表作为一个单独的结果集行的几个集会,那么可以使用的UNION. UNION在MySQL4.0以上版本才能可以使用.本节说明如何使用它. 假设有两个表,潜在和实际的客户列表,供应商购买耗材合并所有三个表中的姓名和地址,来创建一个单一的邮件列表.UNION提供了一种方法做到这一点.假设三个表有以下内容: mysql> SELECT * FROM prospect; +---------+-------+------------------------+ | f

oracle自定义函数如何转成mysql函数

问题描述 oracle自定义函数如何转成mysql函数 这是oracle自定义的函数,怎么把他转成mysql的 create or replace function fun_return_zjxl(in_taskId varchar2, in_work_no varchar2) return varchar2 is v_sum number(10);--质检平均完成量 v_num NUMBER(10);--质检个人完成量 v_qualitied_cnt NUMBER(10); v_result

MySQL解决抓取文章的html标签替换及其mysql函数的用法说明

刚刚做完了一个手机客户端的攻略的Html5 Web App页面,新的需求出现了:由于攻略文章是抓取过来的,有很多外链,一开始没有过滤.于是先用PHP写了一个过滤函数,然后批量执行更新相关数据库记录即可. public static function filter_newslink($aid){ $content = mod_news :: get_newscont($aid); //先过滤图片的外链 $content = preg_replace('/<a (.*)>(<img.*>

mysql中group_concat函数用法

一.语法   GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])   也可以简单的理解   group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])   二.group_concat

【函数】wm_concat包的订制

 [函数]wm_concat包的订制   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 利用系统包创建WM_CONCAT函数(重点) ② ORA-00904: "wm_concat":invalid identifier错误解决 ③ 订制自己的WM_CONCAT函数 ④ listagg分析函数的使用 ⑤ ORA-01489: result o

PHP编程之高级技巧——利用Mysql函数

尽管PHP为我们提供了很多函数,但有些东西处理起来还是不很方便.譬如PHP提供的日期时间函数就很有限.Mysql为我们提供了不少此类的函数.是否可以利用Mysql函数来处理PHP程序呢?笔者做了以下的尝试. <?php     $data_time="1998-12-31 23:59:59";     $connect_id=mysql_connect('localhost');     $query_id=mysql_query("SELECT DATE_ADD('$