Oracle某列存多值查询

前言

一般数据库在存储时都会选择存代码值,但是在运维中经常会用到通过SQL将这些值转化成明文显示,就查询语句进行分享,办法比较笨拙,仅供参考。

使用场景需求说明

业务表S_A

IDNAMEPRODUCT_TYPE
1测试104
2测试202,03
3测试301,03,05

代码表DM_B

IDCODENAME
101论文
202著作
303报告
404专利
505其他

需要查询的结果

IDNAMEPRODUCT_TYPEPRODUCT_NAME
1测试104专利
2测试202,03著作,报告
3测试301,03,05论文,报告,其他

1、创建一个视图对LEVEL进行转换

CREATE OR REPLACE VIEW VIEW_A AS  
SELECT  
  ID,  --需要查询表中的的字段,唯一主键
  NAME,--需要查询表中的的字段,如名称
  regexp_substr(PRODUCT_TYPE, '[^,]+', 1, level) AS PRODUCT_TYPE --需要拆分的字段,直接把PRODUCT_TYPE换成你要拆分的那个字段即可
from 
S_A  -- 表名
where
 1=1  --你如果有条件,在此处加上即可,没有的话去掉加1=1
connect by level <= regexp_count(PRODUCT_TYPE, ',') + 1  --需要拆分的字段,直接把PRODUCT_TYPE换成你要拆分的那个字段即可,如果有多个字段需要同时拆分,用and复制level语句即可
and ID = prior ID --需要查询表中的的字段,唯一主键,把ID换成你表中的唯一主键即可,其他不变
and prior dbms_random.value is not null  --这句话照抄,不要改

视图结果如下

2、通过上面的视图进行查询

SELECT 
ID,
NAME,
PRODUCT_TYPE,
(SELECT LISTAGG((select NAME from DM_B WHERE CODE = a.PRODUCT_TYPE),',') within GROUP (order by a.ID) from VIEW_A  a where a.ID=S_A.id GROUP BY a.ID) AS PRODUCT_NAME
from  S_A;

得到最终结果如下,基本满足想要的结果。

这个不是最优方案,只是解决查询问题,如果有更好的方案欢迎指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值