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

Oracle|字符串特殊处理

作者头像
Java小技巧
发布于 2022-05-23 04:39:45
发布于 2022-05-23 04:39:45
1.5K00
代码可运行
举报
文章被收录于专栏:Java小技巧Java小技巧
运行总次数:0
代码可运行

1问题背景

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

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

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

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

需求目标:

解决方案

1) 创建一个Oracle Table 类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--创建一个表类型
create or replace type table_type as table of varchar2(32676);

2) 创建一个Oracle 自定义 Function

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--创建 自定义 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
代码运行次数:0
运行
AI代码解释
复制
select split('w06549,w06543',',') from dual;

(返回值为Collection类型)

4) 点击查看Collection详情:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select column_value from table(split('w06549,w06543',','));

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle连接字符串函数listagg()和wmsys.wm_concat()用法简介
介绍:其函数在Oracle 11g 版本中推出,对分组后的数据按照一定的排序进行字符串连接。
星哥玩云
2022/08/16
3.9K0
oracle字段精度修改,oracle number类型增加精度
查找原因,发现是因为有些表number类型没有设精度导致的,解决方法如下,修改表结构加上精度
全栈程序员站长
2022/09/15
1.9K0
oracle字段精度修改,oracle number类型增加精度
95-最近几个oracle数据库优化项目的经验总结
最近完成了几个比较大型的oracle数据库的优化项目, 发现一些共性问题, 写出来供大家参考.
老虎刘
2022/12/09
5260
oracle 拼接字符串的函数写法
需求:首先根据角色ID (JSID) 查到角色组ID (JSZID),根据角色组ID (JSZID) 找到对应权限的文档ID (DOCID) 根据文档ID (DOCID) 找到附件的ID (FIEFLID) 根据附件ID找到附件编号(filebh) 附件名称(filemc) 附件后缀名(fileex)
全栈程序员站长
2022/11/05
6500
Oracle 聚合函数解决聚集连接字符串问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53906139
用户1148526
2019/05/25
2K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
行列转换包括以下六种情况:(1)列转行。(2)行转列。(3)多列转换成字符串。(4)多行转换成字符串。(5)字符串转换成多列。(6)字符串转换成多行。其中,重点是行转列和字符串转换成多行。
AiDBA宝典
2019/09/29
1.8K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
【DB笔试面试459】ORA-00904: "wm_concat":invalid identifier错误如何解决?
ORA-00904: "wm_concat":invalid identifier错误如何解决?
AiDBA宝典
2019/09/29
2.4K0
【DB笔试面试459】ORA-00904: "wm_concat":invalid identifier错误如何解决?
拼接字符串SQL需求
同事提了个需求,表中一个字段,存储格式例如abc_x_cd,需要通过SQL拼接出另外一个值,例如abc_x_cd abc x cd,即根据原始值,按照"_"分割,按照每个部分,再通过空格,和原始值拼接。
bisal
2021/09/06
1.3K0
OB 运维 | Oracle 迁移到 OB 过程中的函数改造案例
客户源数据库(Oracle)中有使用 XMLAGG 函数对列拼接的需求。通过查询官方文档发现 OceanBase 3.x 版本不支持 XMLAGG 相关函数,故使用 WM_CONCAT 函数进行适配改造。在初步改造后发现实际输出结果并没有排序,通过加 HINT 进行改造优化后,实现与预期一致的结果。
爱可生开源社区
2024/11/06
1350
OB 运维 | Oracle 迁移到 OB 过程中的函数改造案例
Oracle|19C升级WM_CONCAT函数失效
最近项目Oracle数据库升级由11g升到19C,在验证过程中发现wm_concat函数竟然失效了。
Java小技巧
2022/05/23
3.6K0
Oracle|19C升级WM_CONCAT函数失效
oracle聚合函数XMLAGG用法简介
XMLAGG函数语法基本如图,可以用于列转行,列转行函数在oracle里有好几种方法,wm_concat也可以做
SmileNicky
2019/07/11
3.4K0
oracle聚合函数XMLAGG用法简介
ORA-00932: inconsistent datatypes: expected - got CLOB
      最近数据库从10.2.0.3升级到了10.2.0.5之后,一些对象无法编译通过。查看了这些对象主要表现在之前写法不严格的SQL语法导致了这些package无法成功编译,诸如select查询列中不能使用混淆的列名称等。另外一个比较表现突出的是返回ORA-00932: inconsistent datatypes: expected - got CLOB错误,即不一致的数据类型,获得CLOB数据类型。下面是这个问题的症状及对策。
Leshami
2018/08/13
2.5K0
oracle中拼接字符串_oracle 连接字符串
该方法拼接后是varchar2类型,有最大长度限制,在Oracle Database中,VARCHAR2 字段类型,最大值为4000;PL/SQL中 VARCHAR2 变量类型,最大字节长度为32767。
全栈程序员站长
2022/11/08
2K0
oracle数据库的拼接字符串,Oracle数据库拼接字符串
Ora-03113\Ora-03114与Oracle In 拼接字符串的问题
全栈程序员站长
2022/11/08
9510
通过shell来比较oracle和java中的字符串使用(r4笔记第49天)
今天在无意中看到了java字符串的一些东西,发现和oracle比较起来还是有一定的意义的,但是发现知识点准备好了,比较的时候,每一处java的变更都得重编译运行还是不够直观,其实代码中变化的部分很固定,所以尝试写了一个简单的shell脚本来实现动态编译运行,使得演示也更加直观,使用Runtime.exec还是有一些限制。 比如我们使用一个test1.sh的脚本,这个脚本会根据输入参数动态生成java代码然后自动编译运行。 echo "public class Test{ ">Test.java echo "
jeanron100
2018/03/15
1.8K0
YashanDB|Oracle 中的 pipelined 表函数迁移不过?这样改写就对了
Oracle 的 pipelined 函数在 PL/SQL 中被广泛使用,尤其适合处理字符串分割、流式计算等场景。但在将这类函数迁移至 YashanDB 时,会出现语法不兼容或执行失败的问题。
数据库砖家
2025/05/13
590
oracle wm_concat 拼接乱码
针对oracle拼接函数的乱码,首先查询一下oracle字符的编码是否支持中文,查询语句: SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = ‘NLS_CHARACTERSET’; 如果是中文的,则选择另一种方式: wmsys.wm_concat(to_char(….))..应该加上to_char() 在拼接的字段加上转换。
用户5640963
2019/07/28
1.9K0
MySQL字符串的合并及拆分
按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。
俊才
2020/07/01
6.6K0
[1219]mysql自定义函数split_part、split_last
关键字delimiter的使用: delimiter是mysql分隔符。在mysqlclient中分隔符默认是分号(;)。 假设一次输入的语句较多,而且语句中间有分号,这时须要新指定一个特殊的分隔符。 在前一篇中有设置mysql的触发器时使用样例
周小董
2023/10/10
8570
[1219]mysql自定义函数split_part、split_last
关于字符串匹配查找的总结(43天)
判断一个字符型字段中出现某个字符超过3次的数据行,如果为了简单达到目的,可以直接使用Like来做, SQL> select content from clob_test where content like '%is%is%is%'; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 但是可能在实际应用中,
jeanron100
2018/03/13
9330
推荐阅读
相关推荐
Oracle连接字符串函数listagg()和wmsys.wm_concat()用法简介
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验