oracle如何合并字段 oracle合并字段函数

oracle 有两个表,两个表的两个字段都一样,如何一一对应匹配合并成一个字段?你要是想把空格那个地方显示成“空格”两个字的话就decode,或者nvl一下就好了
oracle语句中如何把一列的值合并为一个值,用逗号隔开?所有版本的oracle都可以使用wm_concat()()函数。例:select wm_concat(name) as name from user;
但如果是oracle11g , 使用listagg() within group()函数。例:select listagg(name, ‘,’) within group( order by name) as name from user;
使用wm_Concat:
使用ListAgg:
结果:
oracle合并字段create table [新的表名]
as
select * from A
union all
select * from B
利用Oracle分析函数实现多行数据合并为一行 demo场景 以oracle自带库中oracle如何合并字段的表emp为例
select ename deptno from emp order by deptno;
ENAMEDEPTNOCLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER WARD
现在想要将同一部门的人给合并成一行记录 如何做呢oracle如何合并字段?如下
ENAMEDEPTNOCLARK KING MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD
通常我们都是自己写函数或在程序中处理 这里我们利用oracle自带的分析函数row_number()和sys_connect_by_path来进行sql语句层面的多行到单行的合并 并且效率会非常高
基本思路
对deptno进行row_number()按ename排位并打上排位号
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename;
DEPTNOENAMERANKCLARK KING MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD 可看出 经过row_number()后 部门人已经按部门和人名进行了排序 并打上了一个位置字段rank
利用oracle的递归查询connect by进行表内递归 并通过sys_connect_by_path进行父子数据追溯串的构造 这里要针对ename字段进行构造 使之合并在一个字段内(数据很多 只截取部分)
select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank;
各部门递归后的数据量都是 (n)/ * n 即 deptno= 数据量 ()/ * = ;
deptno= 数据量 ()/ * = ;deptno= 数据量 ()/ * = ;
DEPTNOENAMERANKCURR_LEVELENAME_PATHCLARK CLARK KING CLARK KING MILLER CLARK KING MILLER KING KING MILLER KING MILLER MILLER MILLER
DEPTNOENAMERANKCURR_LEVELENAME_PATHADAMS ADAMS FORD ADAMS FORD JONES ADAMS FORD JONES SCOTT ADAMS FORD JONES SCOTT SMITH ADAMS FORD JONES SCOTT SMITH FORD FORD JONES FORD JONES SCOTT FORD JONES SCOTT SMITH FORD JONES SCOTT SMITH JONES JONES SCOTT JONES SCOTT SMITH JONES SCOTT SMITH SCOTT SCOTT SMITH SCOTT SMITH SMITH SMITH
这里我们仅列出deptno= 的 至此我们应该能否发现一些线索了 即每个部门中 curr_level最高的那行 有我们所需要的数据 那后面该怎么办 取出那个数据? 对了 继续用row_number()进行排位标记 然后再按排位标记取出即可
对deptno继续进行row_number()按curr_level排位
select deptno ename_path row_number() over(partition by deptno order by deptno curr_level desc) ename_path_rank from (select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank);
DEPTNOENAME_PATHENAME_PATH_RANKCLARK KING MILLER CLARK KING KING MILLER CLARK KING MILLERDEPTNOENAME_PATHENAME_PATH_RANKADAMS FORD JONES SCOTT SMITH ADAMS FORD JONES SCOTT FORD JONES SCOTT SMITH ADAMS FORD JONES FORD JONES SCOTT JONES SCOTT SMITH ADAMS FORD FORD JONES SCOTT SMITH JONES SCOTT ADAMS JONES SMITH SCOTT FORD 这里还是仅列出deptno为 的 至此应该很明了了 在进行一次查询 取ename_path_rank为 的即可获得我们想要的结果
获取想要排位的数据 即得部门下所有人多行到单行的合并
select deptno ename_path from (select deptno ename_path
row_number() over(partition by deptno order by deptno curr_level desc) ename_path_rank
from (select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank))
lishixinzhi/Article/program/Oracle/201311/17343
oracle中怎么合并同一表中两个字段为一个新表中的一个字段?这个问题,我只会个比较笨的办法:
SQL
select
a.a||b.b
from
a
a,b
b;
A.A
---
12
SQL
create
table
c
as
select
a.a||b.b
c
from
a
a,b
b;
表已创建 。
SQL
select
*
from
c;
C
---
12
SQL
刚才的答案实在是......没睡醒,现在改过
oracle字段合并问题select A.第一列,A.第二列||':'||A.第三列||';'||B.第二列||':'||B.第三列
from 表名 A join 表名 B on A.第一列=B.第一列
where A.第二列B.第二列
【oracle如何合并字段 oracle合并字段函数】关于oracle如何合并字段和oracle合并字段函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读