原始需求:

有这样的表:tb和pk两列

PK是将表的多个主键用“|”进行分隔,我想把它变成多行

fundamentals_asia1_af_out

ID_BB_GLOBAL|BC_DT|BC_EQY_DVD_ADJUST_FACT|BC_EQY_DVD_ADJ_FUND_OPER|BC_EQY_DVD_ADJ_FUND_FLAG

变成:

fundamentals_asia1_af_out

ID_BB_GLOBAL

fundamentals_asia1_af_out

BC_DT

fundamentals_asia1_af_out

BC_EQY_DVD_ADJUST_FACT

fundamentals_asia1_af_out

BC_EQY_DVD_ADJ_FUND_OPER

fundamentals_asia1_af_out

BC_EQY_DVD_ADJ_FUND_FLAG

方案一

with t_n as(
select rownum as N from dual
connect by rownum<=200
)
,cte as (
select 'equity_asia1_dif' tb,'ID_BB_GLOBAL|RC' pk from dual union all
select 'fundamentals_asia1_af_out','ID_BB_GLOBAL|BC_DT|BC_EQY_DVD_ADJUST_FACT|BC_EQY_DVD_ADJ_FUND_OPER|BC_EQY_DVD_ADJ_FUND_FLAG' from dual union all
select 'fundamentals_asia1_bs_out','ID_BB_GLOBAL|FISCAL_YEAR_PERIOD|FILING_STATUS|EQY_CONSOLIDATED|ACCOUNTING_STANDARD' from dual
),res as (
select a.*,b.*,nvl(lag(b.n) over(partition by a.tb order by b.n),0) as head
from cte a inner join t_n b on length(a.pk||'|')>=b.n
where substr(a.pk||'|',b.n,1)='|'
)
select tb,substr(pk,head+1,n-head-1),pk
from res
order by tb,n;

用到的知识点:

  • l  公用表表达式:with xxx as ()
  • l  Connect by : 我这里用它来简单的构建了一个1-50的序号。可以百度它的高级用法
  • l  Lag() over():开窗函数
  • l  利用序号表进行拆分(实际是个技巧,它还有很多的妙用)

方案二(正则)

with a as (
select 'equity_asia1_dif' tb,'ID_BB_GLOBAL|RC' pk from dual union all
select 'fundamentals_asia1_af_out','ID_BB_GLOBAL|BC_DT|BC_EQY_DVD_ADJUST_FACT|BC_EQY_DVD_ADJ_FUND_OPER|BC_EQY_DVD_ADJ_FUND_FLAG' from dual union all
select 'fundamentals_asia1_bs_out','ID_BB_GLOBAL|FISCAL_YEAR_PERIOD|FILING_STATUS|EQY_CONSOLIDATED|ACCOUNTING_STANDARD' from dual
)
select t1.tb,regexp_substr(pk,'[^|]+',1,t2.lv) pk from a t1,
(select level lv from (select max(regexp_count(pk,'[^|]+',1))+1 ct from a) b connect by level<b.ct) t2
where regexp_substr(pk,'[^|]+',1,t2.lv) is not null
order by 1,t2.lv

最新文章

  1. memcache(三)内存管理
  2. 递归输出文件夹下的所有文件的名称(转自 MSDN)
  3. android ant 自动编译打包
  4. IIS调用COM组件的权限问题
  5. struts2 action获取ajax提交数据中文乱码问题
  6. 【总结】你所不知道的Java序列化
  7. C++中的冒泡排序,选择排序,插入排序
  8. (转)java读取数据库表信息,子段
  9. linux下安装php扩展redis缓存
  10. java WebService简单使用案例
  11. 20169210《Linux内核原理与分析》第一周作业
  12. js 中的流程控制-条件语句
  13. 自定义控件出现“loaded nib but the view outlet was not set”
  14. 杭电oj1062 Text Reverse
  15. HDU1203_I NEED A OFFER!【01背包】
  16. 第一百一十二节,JavaScript浏览器检测
  17. c语言_头文件_windows.h
  18. TypeScript设计模式之备忘录、命令
  19. 【Django模板进阶007】
  20. mysql 数据操作 目录

热门文章

  1. nnexus3 破解密码
  2. 以Redis为例介绍YCSB的使用
  3. 最新 农信互联java校招面经 (含整理过的面试题大全)
  4. 手把手教你如何安装Tensorflow(Windows和Linux两种版本)
  5. mysql查看和设置最大连接数
  6. Appium移动自动化测试-----(十)appium API 之上下文操作
  7. Python24之递归和迭代
  8. Python11之列表2(获取、删除列表元素、列表分片、拷贝)
  9. cookie设置中文时的编码问题
  10. 【Linux】一步一步学Linux——Linux版本(03)