SQL字符串的合并与拆分实例代码分析

字符串的合并

SQL字符串的合并与拆分实例代码分析

SQL字符串的合并与拆分实例代码分析

在Oracle中可能有多种实现方法,目前我已知的有两种,下面记录下这两种的实现:

字符串合并方法一:

实现SQL:

--方法一SELECT d.dept_name,wm_concat(e.emp_name) FROM employee eINNER JOIN department d ON d.dept_id=e.dept_idGROUP BY d.dept_name;

执行结果:

SQL字符串的合并与拆分实例代码分析

SQL分析:

利用Oracle自带的wm_concat()函数将字符串合并,这里有个缺点,合并的连接符号只能为默认的逗号,不能用其他符号。

字符串合并方法二:

实现SQL:

--方法二SELECT d.dept_name,LISTAGG (e.emp_name, ',') WITHIN GROUP (ORDER BY e.emp_name) namesFROM employee eINNER JOIN department d ON d.dept_id=e.dept_idGROUP BY d.dept_name;

执行结果:

SQL字符串的合并与拆分实例代码分析

SQL分析:

利用Oracle自带的LISTAGG()函数将字符串合并,它的优点在于,合并的连接符号可以指定为任意字符,并且可以很方便实现ORDER BY排序。

字符串的拆分

SQL字符串的合并与拆分实例代码分析

SQL字符串的合并与拆分实例代码分析

在Oracle中可能有多种实现方法,目前我已知的有两种,下面记录下这两种的实现:

字符串拆分方法一:

实现SQL:

--方法一WITH  t (id, name, sub, str) AS (    SELECT id, name, substr(class, 1, instr(class, '、')-1), substr(concat(class,'、'), instr(class, '、')+1)     FROM movies        UNION ALL        SELECT id, name,substr(str, 1, instr(str, '、')-1), substr(str, instr(str, '、')+1)    FROM t WHERE instr(str, '、')>0)  SELECT id, name, subFROM tORDER BY id;

执行结果:

SQL字符串的合并与拆分实例代码分析

SQL分析:

这个语句稍微有些复杂,下面分步骤进行说明:

首先看下movies表的原始数据:

SQL字符串的合并与拆分实例代码分析

1.名列前茅步是将class字段的值根据分隔符(此处为顿号)进行初步拆分,拆分为两个部分。名列前茅部分为class字段要拆分的名列前茅个值,第二部分为class字段要拆分的其余部分的值。

SQL字符串的合并与拆分实例代码分析

2.第二步利用WITH表达式实现递归查询,根据分隔符(此处为顿号)循环将名列前茅步操作中未拆分的值(第二部分)进行拆分,一直拆分到字段的最后一个分割符为止,递归结束的数据放在临时表t中。

SQL字符串的合并与拆分实例代码分析

3.第三步是一个简单的查询,从第二步的临时表t中查询记录并排序。

SQL字符串的合并与拆分实例代码分析

字符串拆分方法二:

实现SQL:

--方法二SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;

执行结果:

SQL字符串的合并与拆分实例代码分析

SQL分析:

这种方法其实是通过自定义一个函数(function)来处理字符串,函数split的逻辑其实跟方法一的逻辑差不多,都是用到了递归,将字符串中的值根据分隔符一次一次拆分,最终返回拆分后的字符串。这种方法个人感觉更好一些,因为是将拆分逻辑进行了封装,使用起来更简单,逻辑更清晰。

下面是split函数的创建脚本:

create or replace function split (p_list clob, p_sep varchar2 := ',')  return tabletype  pipelined is  l_idx    pls_integer;  v_list  varchar2 (32676) := to_char(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;

函数的返回值类型tabletype也是自定义的一个类型。

下面是该类型的创建脚本:

create or replace type tabletype as table of varchar2(32676);

到此,相信大家对“SQL字符串的合并与拆分实例代码分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文章标题:SQL字符串的合并与拆分实例代码分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/22137

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云亿速云认证作者
上一篇 2022年9月1日 下午11:05
下一篇 2022年9月1日

相关推荐

  • sqlserver怎么导出mdf

    sqlserver导出mdf操作方法: 1、打开sql server选择要导出的数据库,右击“任务—>分离”。 2、进入后可以看到要分离成mdf的文件的数据库。 3、勾选分离数据库的删除和更新,点击“确定”。 4、sql server就成功导出mdf和ldf文件了,默认导出的路径在 C:Pro…

    2022年9月8日
    1.6K00
  • html是不是静态页面

    html是静态页面;html表示结构,css表示样式,由HTML与CSS制作的页面叫做静态页面,动态页面指的是动态数据的页面,而非模拟数据的页面,html网页当中的数据均为静态数据,当前端页面与后台整合之后,网页当中的数据是来源于数据库时,则称为动态页面。 本教程操作环境:windows10系统、H…

    2022年9月8日
    27800
  • Vue前端怎么整合ElementUi

    Vue前端整合Element Ui Element UI 是一套采用 Vue 2.0 作为基础框架实现的组件库,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助网站快速成型。 1.安装Element Ui组件库 WIN+R输入CMD(必须以管理员身份运行)…

    2022年9月21日
    16600
  • windows中group policy client服务未能登录如何解决

    解决方法: 1、首先按下快捷键“win+r”打开运行,输入“regedit”。 2、然后选择选项栏:HKEY_CURRENT_USER并右击,选择“权限”。 3、然后点击安全下面的“添加”。 4、之后可以登录你的账号,没有改过的话都是“administrator”。 5、最后将权限下面的各项权限勾选…

    2022年8月29日
    32300
  • 怎么在html页面中调用外部样式

    两种调用方法:1、使用link标签调用,语法“<link href=”外部样式表文件路径” rel=”stylesheet” type=”text/css” />”;2、利用“@import”关键字调用,语法“&lt…

    2022年9月16日
    34000
  • windows office365联网能用吗

    office365必须联网吗: 答:office365联网才能使用。 所有的文件都是在网络中保存并进行编辑。 office365联网如何使用: 1、打开office网址,点我直达。 2、选择需要使用的工具,以word为例。 3、新建空白文档后即可编辑。 “windows office365联网能用吗…

    2022年9月21日
    21800
  • SqlServer怎么创建自动收缩事务日志任务

    1. 进入SSMS 点击展开sqlserver代理,右键点击“作业”,然后选择新建作业。 2. 填写名称 名称可以随便填写,只要能表示这次作业任务就行了。简洁明了,让自己后面能看懂。 所有者选择sa或者windows用户。如果需要远程操作,建议选择sa账户。windows账户只支持本地登陆后操作执行…

    2022年9月13日
    23500
  • 如何实现sqlmap time-based inject的分析

    1. 前言 sql注入如何检测的? 我的回答是:在甲方做安全,sql注入检测还是比较好做的。 1) 报错注入检测。 2) 别做bool的报错注入,误报比较高。 3) 做基于time-based的时间注入,联系运维做上慢日志db记录,监控sleep,benchmark的关键字监控,可以在sleep的时…

    2022年9月21日
    22100
  • SpringCloud Hystrix怎么使用

    Hystrix是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供以下功能: 服务隔离 服务隔离主要包括线程池隔离以及信号量隔离。 服务熔断 当请求持续失败的时候,服务进行熔断,默认熔断5S,也是就说在这5S内的请求一律拒绝。 服务降级 当前请求失败的时候,返回降级的结果。 1. …

    2022年9月6日
    21900
  • daisyUI怎么解决TailwindCSS堆砌class问题

    daisyUI概述 daisyUI是一个可定制的TailwindCSS的组件库,目前(发文日期)在GitHub中已经有12.8k的star数量。 它与现在常用的ElementUI或者AntDesign不同,它提供了一些类名,类似于Bootstrap,想要拿来即用的组件需要自己进行封装。 daisyU…

    2022年8月30日
    54800
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部