保存在这里,方便自己以后查看 (⊙_⊙) ╮(╯▽╰)╭
我们可以先这样创建一张需要的临时表(Role 表):
select 'role_01' as role_id, 'admin' as role_category from dual
union all
select 'role_02' as role_id, 'admin' as role_category from dual
union all
select 'role_03' as role_id, 'normal' as role_category from dual
union all
select 'role_04' as role_id, 'normal' as role_category from dual
union all
select 'role_05' as role_id, 'normal' as role_category from dual
union all
select 'role_06' as role_id, 'normal' as role_category from dual
union all
select 'role_07' as role_id, 'normal' as role_category from dual
union all
select 'role_08' as role_id, 'normal' as role_category from dual
表结构:
现在我们要根据 role_category 分组,把相同 role_category 下的 role_id 连接起来,就是列 role_id 转成行,大家可能很容易想到使用 wm_concat() 方法来进行:
select role_category,
wm_concat(role_id) as role_id_list
from (
select 'role_01' as role_id, 'admin' as role_category from dual
union all
select 'role_02' as role_id, 'admin' as role_category from dual
union all
select 'role_03' as role_id, 'normal' as role_category from dual
union all
select 'role_04' as role_id, 'normal' as role_category from dual
union all
select 'role_05' as role_id, 'normal' as role_category from dual
union all
select 'role_06' as role_id, 'normal' as role_category from dual
union all
select 'role_07' as role_id, 'normal' as role_category from dual
union all
select 'role_08' as role_id, 'normal' as role_category from dual
)
group by role_category
好了,我们得到了查询结果:
但是这个结果是否有点问题呢?
我们发现第2行第2列的数据其 role_id 并不是按照从小到大排序的,似乎并不那么完美,得修改一下sql代码:
-- partition by role_category order by role_id 表示按照 role_category 分组,按照 role_id 排序
select role_category,
wm_concat(role_id) over(partition by role_category order by role_id)
as role_id_list
from (
select 'role_01' as role_id, 'admin' as role_category from dual
union all
select 'role_02' as role_id, 'admin' as role_category from dual
union all
select 'role_03' as role_id, 'normal' as role_category from dual
union all
select 'role_04' as role_id, 'normal' as role_category from dual
union all
select 'role_05' as role_id, 'normal' as role_category from dual
union all
select 'role_06' as role_id, 'normal' as role_category from dual
union all
select 'role_07' as role_id, 'normal' as role_category from dual
union all
select 'role_08' as role_id, 'normal' as role_category from dual
)
现在的查询结果:
这次的 role_id 都是排好序的,但是查询结果太多了,我们需要的只是最长的那一行数据,在 sql 中加一个 max() 方法就可以了:
select role_category,
max(role_id_list)
from (
select role_category,
wm_concat(role_id) over(partition by role_category order by role_id)
as role_id_list
from (
select 'role_01' as role_id, 'admin' as role_category from dual
union all
select 'role_02' as role_id, 'admin' as role_category from dual
union all
select 'role_03' as role_id, 'normal' as role_category from dual
union all
select 'role_04' as role_id, 'normal' as role_category from dual
union all
select 'role_05' as role_id, 'normal' as role_category from dual
union all
select 'role_06' as role_id, 'normal' as role_category from dual
union all
select 'role_07' as role_id, 'normal' as role_category from dual
union all
select 'role_08' as role_id, 'normal' as role_category from dual
)
)
group by role_category
这次我们得到了想要的结果:
但是为了得到这两条数据我们查出的数据多了点,而且又用了一次 max() 方法,这在效率上肯定是很低的
wm_concat() 是系统函数,也许有的用户登录相关 Oracle 数据库得不到该函数的使用权限(比如我就是)
下面再来看一种能够实现同样功能,但是不使用 wm_concat() 函数的方法。
同样是使用最开始定义的那张临时表,我们先作一下查询,增加一列 row_number 用来记录 role_category 分组下的 role_id 序号,这里用到了系统函数 row_number():
select role_category,
role_id,
(row_number() over(partition by role_category order by role_id)) as row_number
from (
select 'role_01' as role_id, 'admin' as role_category from dual
union all
select 'role_02' as role_id, 'admin' as role_category from dual
union all
select 'role_03' as role_id, 'normal' as role_category from dual
union all
select 'role_04' as role_id, 'normal' as role_category from dual
union all
select 'role_05' as role_id, 'normal' as role_category from dual
union all
select 'role_06' as role_id, 'normal' as role_category from dual
union all
select 'role_07' as role_id, 'normal' as role_category from dual
union all
select 'role_08' as role_id, 'normal' as role_category from dual
)
查询结果:
现在我们根据 row_number 把相同 role_category 的 role_id 用系统函数 sys_connect_by_path() 连接起来:
select role_category,
sys_connect_by_path(role_id, ',') as role_id_list
from (
select role_category,
role_id,
(row_number() over(partition by role_category order by role_id))
as row_number
from (
select 'role_01' as role_id ,'admin' as role_category from dual
union all
select 'role_02' as role_id ,'admin' as role_category from dual
union all
select 'role_03' as role_id ,'normal' as role_category from dual
union all
select 'role_04' as role_id ,'normal' as role_category from dual
union all
select 'role_05' as role_id ,'normal' as role_category from dual
union all
select 'role_06' as role_id ,'normal' as role_category from dual
union all
select 'role_07' as role_id ,'normal' as role_category from dual
union all
select 'role_08' as role_id ,'normal' as role_category from dual
)
)
where connect_by_isleaf = 1
start with row_number = 1
connect by row_number - 1 = prior row_number
and role_category = prior role_category
查询结果:
开头多余了一个逗号,最后再用系统函数 ltrim() 来去掉这个逗号就OK了:
select role_category,
ltrim(sys_connect_by_path(role_id, ','), ',') as role_id_list
from (
select role_category,
role_id,
(row_number() over(partition by role_category order by role_id))
as row_number
from (
select 'role_01' as role_id ,'admin' as role_category from dual
union all
select 'role_02' as role_id ,'admin' as role_category from dual
union all
select 'role_03' as role_id ,'normal' as role_category from dual
union all
select 'role_04' as role_id ,'normal' as role_category from dual
union all
select 'role_05' as role_id ,'normal' as role_category from dual
union all
select 'role_06' as role_id ,'normal' as role_category from dual
union all
select 'role_07' as role_id ,'normal' as role_category from dual
union all
select 'role_08' as role_id ,'normal' as role_category from dual
)
)
where connect_by_isleaf = 1
start with row_number = 1
connect by row_number - 1 = prior row_number
and role_category = prior role_category
分享到:
相关推荐
2. **数据导出**:在导出数据时,可能需要将多列数据转换为一列,方便后续处理或导入到其他系统中。 3. **数据汇总**:当需要对某一类别的数据进行汇总时,可以使用该函数将所有相关的记录拼接在一起,便于查看和...
Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...
1. **表的元数据**:在Oracle中,可以通过查询特定的数据字典视图来获取表的元数据信息。对于用户所拥有的表,可以使用`USER_TAB_COLUMNS`视图。该视图包含了关于表列的各种信息,如列名、数据类型等。 2. **WM_...
在实际应用中,选择哪种方法取决于具体的需求、数据结构以及Oracle数据库的版本。例如,如果只需要简单的字符串连接,`LISTAGG`通常是首选;如果需要处理复杂的数据关系,可能需要借助`CONNECT BY`或`MODEL`。在使用...
在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常常见的需求之一。本文将详细介绍几种...
1. **ROWNUM**:Oracle提供了一个内置的伪列`ROWNUM`,它可以为查询结果集中的每一行返回一个唯一的行号。`ROWNUM`从1开始计数,并且只能用于`WHERE`或`HAVING`子句。 2. **OFFSET与FETCH FIRST**:虽然Oracle本身不...
- 将每列的数据拼接成一行,并使用 `utl_file.put_line` 写入文件。 4. **异常处理**: - 捕获并处理可能出现的异常情况,如超出定义列范围时跳出循环。 #### 四、总结 通过上述分析,我们可以了解到利用Oracle ...
以下是Oracle列合并的一些常用方法: 1. **Oracle 10G以前使用WMSYS.WM_CONCAT**: 在Oracle 10G及更早版本中,我们可以使用`WMSYS.WM_CONCAT`函数来合并列的值。这个函数会将字段的值用逗号(,)分隔开来。例如,...
索引是数据库中用于快速查找记录的一种数据结构,选择性高的列(即具有较少重复值的列)创建索引可以显著提高查询效率。Oracle支持B树索引、位图索引和函数索引等多种类型,根据实际需求选择合适的索引类型。 其次...
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
在数据库管理与开发过程中,经常会遇到需要将表中的两列数据合并为一列的情况。这种需求常见于数据清洗、报表生成或数据展示等场景。不同的数据库管理系统(Database Management System,DBMS)提供了各自的方法来...
这种做法是Oracle性能监控工具如Statspack和ASH(Active Session History)所常用的方法。通过对比不同时间区间的数据,可以观察到用户数量增长或数据增加对系统资源使用的影响。 在V$SYSSTAT视图中,包含多个统计...
1. **字符串拼接操作**: 使用`||`进行字符串拼接会消耗较多的资源,特别是在处理大量数据时。 2. **全表扫描**: 使用`SELECT *`会导致数据库执行全表扫描,这意味着需要读取表中的每一行数据,即使只需要部分列的...
在Oracle中,VARCHAR2类型的列可以存储这些特殊字符,但长度有限制。如果数据太长,可以考虑使用CLOB类型来存储。 在处理带有换行的字符串时,有时需要进行额外的处理,例如在拼接或比较字符串时。可以使用`REGEXP_...
LONG列在Oracle中用于存储大文本或二进制数据,最大可存储约2GB的数据。当试图插入的数据超过这个限制,或者没有正确处理LONG类型的数据时,就会出现这个错误。 解决"ORA-01461"问题的方法通常有以下几点: 1. ...
Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...
`将`name`和`sex`列拼接起来。 - `SUBSTR`: 截取字符串的一部分。如`SELECT SUBSTR(name, 1, 3) AS short_name FROM employees;`截取`name`列前三个字符。 - `LENGTH`: 获取字符串长度。如`SELECT LENGTH(name) ...
### Oracle数据库功能详解 #### 一、SQL语言基础 **SQL**(Structured Query Language,结构化查询语言)是用于管理关系数据库...无论是基本的数据管理操作还是高级的数据处理需求,Oracle都能提供强大的支持和服务。
- GROUP BY:按一个或多个列进行数据分组。 - 汇总函数:如COUNT、SUM、AVG、MAX和MIN,用于计算分组后的总计、平均值等统计信息。 - HAVING子句:用于过滤GROUP BY后的结果集。 6. **第7章 子查询** - 子查询...