`
flforever1213
  • 浏览: 124766 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 拼接列数据的方法

阅读更多

保存在这里,方便自己以后查看 (⊙_⊙) ╮(╯▽╰)╭

 

我们可以先这样创建一张需要的临时表(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       
0
0
分享到:
评论

相关推荐

    oracle中将列拼接字段函数

    2. **数据导出**:在导出数据时,可能需要将多列数据转换为一列,方便后续处理或导入到其他系统中。 3. **数据汇总**:当需要对某一类别的数据进行汇总时,可以使用该函数将所有相关的记录拼接在一起,便于查看和...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    oracle查询表的所有列并用逗号隔开

    1. **表的元数据**:在Oracle中,可以通过查询特定的数据字典视图来获取表的元数据信息。对于用户所拥有的表,可以使用`USER_TAB_COLUMNS`视图。该视图包含了关于表列的各种信息,如列名、数据类型等。 2. **WM_...

    Oracle多行记录合并

    在实际应用中,选择哪种方法取决于具体的需求、数据结构以及Oracle数据库的版本。例如,如果只需要简单的字符串连接,`LISTAGG`通常是首选;如果需要处理复杂的数据关系,可能需要借助`CONNECT BY`或`MODEL`。在使用...

    oracle行转列较精典的解决方案

    在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常常见的需求之一。本文将详细介绍几种...

    Oracle分页(limit方式的运用)

    1. **ROWNUM**:Oracle提供了一个内置的伪列`ROWNUM`,它可以为查询结果集中的每一行返回一个唯一的行号。`ROWNUM`从1开始计数,并且只能用于`WHERE`或`HAVING`子句。 2. **OFFSET与FETCH FIRST**:虽然Oracle本身不...

    oracle数据库的表数据导出为csv文件

    - 将每列的数据拼接成一行,并使用 `utl_file.put_line` 写入文件。 4. **异常处理**: - 捕获并处理可能出现的异常情况,如超出定义列范围时跳出循环。 #### 四、总结 通过上述分析,我们可以了解到利用Oracle ...

    oracle列合并的实现方法

    以下是Oracle列合并的一些常用方法: 1. **Oracle 10G以前使用WMSYS.WM_CONCAT**: 在Oracle 10G及更早版本中,我们可以使用`WMSYS.WM_CONCAT`函数来合并列的值。这个函数会将字段的值用逗号(,)分隔开来。例如,...

    Oracle数据库查询优化的方法

    索引是数据库中用于快速查找记录的一种数据结构,选择性高的列(即具有较少重复值的列)创建索引可以显著提高查询效率。Oracle支持B树索引、位图索引和函数索引等多种类型,根据实际需求选择合适的索引类型。 其次...

    一列分割成多列,多行合并为一行

    SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行

    oracle 存储过程中某入参是逗号分隔,并且参数要使用在in过滤语句中

    oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现

    Mysql、oracle、Sybase数据库两列合并成一列的sql语句

    在数据库管理与开发过程中,经常会遇到需要将表中的两列数据合并为一列的情况。这种需求常见于数据清洗、报表生成或数据展示等场景。不同的数据库管理系统(Database Management System,DBMS)提供了各自的方法来...

    oracle动态性能视图

    这种做法是Oracle性能监控工具如Statspack和ASH(Active Session History)所常用的方法。通过对比不同时间区间的数据,可以观察到用户数量增长或数据增加对系统资源使用的影响。 在V$SYSSTAT视图中,包含多个统计...

    提高Oracle数据库查询效率

    1. **字符串拼接操作**: 使用`||`进行字符串拼接会消耗较多的资源,特别是在处理大量数据时。 2. **全表扫描**: 使用`SELECT *`会导致数据库执行全表扫描,这意味着需要读取表中的每一行数据,即使只需要部分列的...

    oracle实现换行

    在Oracle中,VARCHAR2类型的列可以存储这些特殊字符,但长度有限制。如果数据太长,可以考虑使用CLOB类型来存储。 在处理带有换行的字符串时,有时需要进行额外的处理,例如在拼接或比较字符串时。可以使用`REGEXP_...

    Oracle_11g_JDBC_ojdbc6.rar

    LONG列在Oracle中用于存储大文本或二进制数据,最大可存储约2GB的数据。当试图插入的数据超过这个限制,或者没有正确处理LONG类型的数据时,就会出现这个错误。 解决"ORA-01461"问题的方法通常有以下几点: 1. ...

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    ORACLE SQL

    `将`name`和`sex`列拼接起来。 - `SUBSTR`: 截取字符串的一部分。如`SELECT SUBSTR(name, 1, 3) AS short_name FROM employees;`截取`name`列前三个字符。 - `LENGTH`: 获取字符串长度。如`SELECT LENGTH(name) ...

    oracle数据库的功能

    ### Oracle数据库功能详解 #### 一、SQL语言基础 **SQL**(Structured Query Language,结构化查询语言)是用于管理关系数据库...无论是基本的数据管理操作还是高级的数据处理需求,Oracle都能提供强大的支持和服务。

    oracle基础学习pdf

    - GROUP BY:按一个或多个列进行数据分组。 - 汇总函数:如COUNT、SUM、AVG、MAX和MIN,用于计算分组后的总计、平均值等统计信息。 - HAVING子句:用于过滤GROUP BY后的结果集。 6. **第7章 子查询** - 子查询...

Global site tag (gtag.js) - Google Analytics