前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle|字符串特殊处理

Oracle|字符串特殊处理

作者头像
Java小技巧
发布2022-05-23 12:39:45
1.4K0
发布2022-05-23 12:39:45
举报
文章被收录于专栏:Java小技巧

1问题背景

今天在做报表查询时遇到一个SQL问题:

某需求表环节处理人字段存储的是用户的工号,由于有多人的情况,所以该表在数据存储时是以英文逗号分开存储的。

客户需求是要把用户的工号展示成姓名,多个人用逗号区分。

需求表字段存储结构如下:

需求目标:

解决方案

1) 创建一个Oracle Table 类型

代码语言:javascript
复制
--创建一个表类型
create or replace type table_type as table of varchar2(32676);

2) 创建一个Oracle 自定义 Function

代码语言:javascript
复制
--创建 自定义 split 函数
create or replace function split(p_list clob, p_sep varchar2 := ',')
  return table_type
  pipelined is
  l_idx pls_integer;
  v_list varchar2(32676) := p_list;
begin
  loop
    l_idx := instr(v_list, p_sep);
    if l_idx > 0 then
      pipe row(substr(v_list, 1, l_idx - 1));
      v_list := substr(v_list, l_idx + length(p_sep));
    else
      pipe row(v_list);
      exit;
    end if;
  end loop;
end;

3) 演示Table类型+自定义函数效果

代码语言:javascript
复制
select split('w06549,w06543',',') from dual;

(返回值为Collection类型)

4) 点击查看Collection详情:

5) 演示Table类型+自定义函数效果

代码语言:javascript
复制
select column_value from table(split('w06549,w06543',','));

(返回值为一列数据,列名称为COLUMN_VALUE)

6) 通过Table类型和自定义函数实现需求目标

代码语言:javascript
复制
SELECT e.emi_current_handler,
       (SELECT listagg(p.pn_name, ',') within
         GROUP(
         ORDER BY p.id)
          FROM person p
         where p.id in
               (select column_value
                  from table(split(e.emi_current_handler, ',')))) USER_NAME
  FROM env_maintenance_info e
 where e.emi_current_handler is not null
   and instr(e.emi_current_handler, ',') > 0;

(问题完美解决)

解释说明

自定义split函数:

该函数有两个参数,第一个参数为要处理的字符串,第二个参数为要分割的方式。灵活的支持业务表多种形式的分割,列:“,”、“|”、“&”、“_”...

listagg函数:

Oracle19C版本后因wm_concat函数效率过低已废弃,可以通过listagg函数来实现行转列的需求。

wm_concat函数使用示例:

listagg函数使用示例:

wm_concat与listagg对比:

1) wm_concat性能略差

2) wm_concat使用后为CLOB字段需要to_char转换

3) listagg可以自定义排序方式、以及拼接方式

4) listagg性能优于wm_concat

5) 两者都有长度限制

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1问题背景
  • 解决方案
  • 解释说明
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档