oracle 多行,一行转换(10g以上)

--1. 多行转换成一行

-- 1.1 table 语句
CREATE TABLE "LOCAL_WPC04_01"."A_ROW_STR"
   ( "ID" NUMBER(*,0),
 "COL" VARCHAR2(10 BYTE)
   );
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'b');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'c');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'d');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'e');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (3,'c');
-- 1.2 转换语句 by Hierarchical
SELECT t.id id,
  SUBSTR(sys_connect_by_path(t.col, ','), 2) str
FROM
  (SELECT id,
    col,
    row_number() over(PARTITION BY id ORDER BY col) rn
  FROM a_row_str
  ) t
WHERE connect_by_isleaf = 1
  START WITH rn         = 1
  CONNECT BY rn         = PRIOR rn + 1
AND id                  = PRIOR id;

--2.一行转换成多行


--2.1 table 语句
CREATE TABLE A_STR_ROW
   ( "ID" NUMBER(*,0),
 "STR" VARCHAR2(32 BYTE)
   );
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (1,'a,b,c');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (2,'a,d,e');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (3,'c');


--2.2 转换语句
SELECT id,
LEVEL AS p,
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
FROM a_str_row
CONNECT BY id = PRIOR id
AND PRIOR dbms_random.VALUE IS NOT NULL
AND LEVEL <=
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
ORDER BY 1, 2;

--3. 多行转换成一行 for user_tab_columns

SELECT DISTINCT t.table_name tabname,
    LISTAGG(t.column_name,',') within GROUP(
  ORDER BY t.column_id ASC) OVER (PARTITION BY table_name) AS colname
  FROM user_tab_columns t
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值