Oracle多值字典解析

Oracle多值字典解析

问题描述:

一般情况下,业务数据中存储的字典值为单值,比如"1"或"2",直接关联字典表后,可以解析出字典值;
但有时因业务要求,需要存储多选值,比如:“1,2,11,12”,此时,无法直接关联字典表进行解析;
本文讲解如下通过函数,进行多值字典解析;

适用范围

oracle 11g

业务字典表:

GUPIDGUPNAME
1分组1
2分组2
3分组3
4分组4
5分组5
11分组11
12分组12

业务数据表:

IDGUPIDS
11,2,3
21,11,12
34,5

最终需要解析成如下结果:

IDGUPIDGUPNAME
11分组1
12分组2
12分组3
21分组1
211分组11
212分组12
34分组4
35分组5

解决办法:

通过组合使用 CONNECT BY LEVEL,regexp_substr 语法可以解析出字典内容。

/* 业务字典表 */
create table tb_dic as 
  select 1 as gupId, '分组1' as gupName from dual union all 
  select 2 as gupId, '分组2' as gupName from dual union all 
  select 3 as gupId, '分组3' as gupName from dual union all 
  select 4 as gupId, '分组4' as gupName from dual union all 
  select 5 as gupId, '分组5' as gupName from dual union all 
  select 11 as gupId, '分组11' as gupName from dual union all 
  select 12 as gupId, '分组12' as gupName from dual 
;

/* 业务数据表 */
create table tb_data as 
  select 1 as id, '1,2,3' as gupIds from dual union all 
  select 2 as id, '1,11,12' as gupIds from dual union all 
  select 3 as id, '4,5' as gupIds from dual 
;

/* 分析业务数据中,存在的字典值数 */
select x1.id, x1.gupIds, x0.gupId, x0.gupName
from tb_dic x0,
  (select id, gupIds,length(gupIds) - length(replace(gupIds, ',')) + 1 as dics
  from tb_data
  ) x1 ,
  (/* 用于生成连续数值 */
  select LEVEL as rid from dual CONNECT BY LEVEL <= (select max(gupId) from tb_dic x0)
  ) x2 
where regexp_substr(x1.gupIds, '[^,]+',1,x2.rid)=x0.gupId
and x2.rid <=x1.dics
order by 1,3
;

或者,整合上面的内容为一条sql,输出结果一样,如下:

with  x0 as (/* 业务字典表 */
  select 1 as gupId, '分组1' as gupName from dual union all 
  select 2 as gupId, '分组2' as gupName from dual union all 
  select 3 as gupId, '分组3' as gupName from dual union all 
  select 4 as gupId, '分组4' as gupName from dual union all 
  select 5 as gupId, '分组5' as gupName from dual union all 
  select 11 as gupId, '分组11' as gupName from dual union all 
  select 12 as gupId, '分组12' as gupName from dual 
), x1 as (/* 业务数据表 */
  select 1 as id, '1,2,3' as gupIds from dual union all 
  select 2 as id, '1,11,12' as gupIds from dual union all 
  select 3 as id, '4,5' as gupIds from dual 
), x2 as (/* 分析业务数据中,存在的字典值数 */
select id, gupIds,length(gupIds) - length(replace(gupIds, ',')) + 1 as dics
from x1
)
select x2.id, x2.gupIds, x0.gupId, x0.gupName
  from x2,x0,
    (/* 用于生成连续数值 */
    select LEVEL as rid from dual CONNECT BY LEVEL <= (select max(gupId) from x0)
    ) t 
where regexp_substr(x2.gupIds, '[^,]+',1,t.rid)=x0.gupId
and t.rid <=x2.dics
order by 1,3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值