【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
系列文章目录
【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事
【SQL开发实战技巧】系列(二):简单单表查询
【SQL开发实战技巧】系列(三):SQL排序的那些事
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起
【SQL开发实战技巧】系列(十一):拿几个案例讲讲translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
文章目录
- 系列文章目录
- 前言
- 一、将分隔数据转换为多值IN列表
- 二、按字母顺序排列字符串
- 三、去重后按字母顺序排列字符串
- 四、如何删除字符串中的字符保留数字
- 总结
前言
本篇文章讲解的主要内容是:如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
一、将分隔数据转换为多值IN列表
工作中经常有这么一个场景,用户通过前端页面传入了一个字符串列表如:('CLARK,JONES,MARTIN')
,要求根据这个串查询相关用户信息。
开发人员需要你提供一个sql他嵌套到代码里面,想直接把这个字符串传给这个sql然后做查询,java代码如下,你会怎么写?
String str="CLARK,JONES,MARTIN";
String sql="select * from emp where ename in("+str+")";
你要是用下面这种方式写,那可能会被问候了:
SQL> select * from emp where ename in('CLARK,JONES,MARTIN');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------SQL>
直接把'CLARK,JONES,MARTIN'
带入肯定是查询不到数据的。
那该怎么实现???🤔🤔🤔
我们需要做个转换。把前端传过来的'CLARK,JONES,MARTIN'
改写成'CLARK','JONES','MARTIN'
然后再查询就能查到数据了,
接下来还是用正则来做这个需求,正则在这块有先天优势!下面是我模拟的上面java代码传值的过程:
SQL> var v_name varchar2;SQL> exec :v_name:='CLARK,JONES,MARTIN';PL/SQL procedure successfully completedv_name
---------
CLARK,JONES,MARTINSQL> select *2 from emp3 where ename in (select regexp_substr(:v_name, '[^,]+' ,1, level)4 from dual5 connect by level <= regexp_count(:v_name,',')+1);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------7782 CLARK MANAGER 7839 1981-6-9 2450.00 107566 JONES MANAGER 7839 1981-4-2 2975.00 207654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
v_name
---------
CLARK,JONES,MARTIN
为了便于理解,我拿出来内部的查询结果以及对应伪列level给大家看看
SQL> select regexp_substr(:v_name, '[^,]+' ,1, level)as userss,level2 from dual3 connect by level <= regexp_count(:v_name,',')+1;USERSS LEVEL
-------------------------------------------------------------------------------- ----------
CLARK 1
JONES 2
MARTIN 3v_name
---------
CLARK,JONES,MARTIN
每行对应的正则表达式'[^,]+'
表示对应一个不包含逗号的字符串,最后一个参数表示分别取第1、2、3三个串。
那么结合这个语句就可以达到需求。从上面结果看到,原来v_name='CLARK,JONES,MARTIN'
是一个字符串,而现在变成了三行了,也就是对应'CLARK','JONES','MARTIN'
了
这样子in('CLARK','JONES','MARTIN')
就能正常查询到结果了!
二、按字母顺序排列字符串
我现在有个需求,想把emp表中的ename名称,按照字母顺序排序!!!如ADAMS->AADMS
怎么做???
这么做!
分两步:
- 把ename拆分为单个字母显示。
- 把多行数据合并为一行显示。
下面先处理一行数据
- 1、拆分
SQL> select 'ADAMS' as sour,regexp_count('ADAMS','[[:alpha:]]') as lev, regexp_substr('ADAMS','[[:alpha:]]',1,level) as str2 from dual3 connect by level<=regexp_count('ADAMS','[[:alpha:]]')4 ;SOUR LEV STR
-------------------------------- ---------- ----------------------------------------------------------------
ADAMS 5 A
ADAMS 5 D
ADAMS 5 A
ADAMS 5 M
ADAMS 5 S
- 2、用listagg合并
SQL> with t as2 (select 'ADAMS' as sour,3 regexp_count('ADAMS', '[[:alpha:]]') as lev,4 regexp_substr('ADAMS', '[[:alpha:]]', 1, level) as str5 from dual6 connect by level <= regexp_count('ADAMS', '[[:alpha:]]')7 )8 select sour, listagg(str) within group(order by str) as heb9 from t10 group by sour;SOUR HEB
-------------------------------- --------------------------------------------------------------------------------
ADAMS AADMS
这一步操作内容大家应该都能看明白了,那接下来的话,咱们处理全表的数据!
- 3、处理全表数据
下面进一步处理全表数据,可以把前面的语句改为标量子查询:
SQL> select ename,2 (select listagg(substr(ename, level, 1)) within group(order by substr(ename, level, 1))3 from dual4 connect by level <= length(ename)) as sort_ename5 from emp;ENAME SORT_ENAME
---------- --------------------------------------------------------------------------------
SMITH HIMST
ALLEN AELLN
WARD ADRW
JONES EJNOS
MARTIN AIMNRT
BLAKE ABEKL
CLARK ACKLR
SCOTT COSTT
KING GIKN
TURNER ENRRTU
ADAMS AADMS
JAMES AEJMS
FORD DFOR
MILLER EILLMR
test estt15 rows selected
或许有人会注意到,在上面的数据中有很多字母是重复的,如我们举例用的字符串ADAMS->AADMS,排序后就有两个"A"。对这种数据,如果要去重怎么办?
三、去重后按字母顺序排列字符串
我们在标量子查询里加一个group by
即可(注意:把"substr(ename,LEVEL,1)"
当作一个整体比较容易理解)。
SQL> select ename,2 (select listagg(min(substr(ename, level, 1))) within group(order by min(substr(ename, level, 1)))3 from dual4 connect by level <= length(ename)5 group by substr(ename, level, 1)) as sort_ename6 from emp;ENAME SORT_ENAME
---------- --------------------------------------------------------------------------------
SMITH HIMST
ALLEN AELN
WARD ADRW
JONES EJNOS
MARTIN AIMNRT
BLAKE ABEKL
CLARK ACKLR
SCOTT COST
KING GIKN
TURNER ENRTU
ADAMS ADMS
JAMES AEJMS
FORD DFOR
MILLER EILMR
test est15 rows selected
如此我们就实现了去重后再排序的需求
四、如何删除字符串中的字符保留数字
用人话说就是想找出来带数值的数据并清理掉非数字字符,
有这么一个临时表
SQL> select to_char(empno) from emp where deptno=102 union all3 select dname||deptno from dept4 union all5 select ename from emp where deptno=20;TO_CHAR(EMPNO)
------------------------------------------------------
7782
7839
7934
ACCOUNTING10
RESEARCH20
SALES30
OPERATIONS40
SMITH
JONES
SCOTT
ADAMS
FORD12 rows selected
我现在有个需求,想找一下哪些数据是包含数字的。
那这个需求怎么实现起来简单呢?
这么做:
先正则替换掉所有非数字字符,然后外层嵌套一层找非空行就可以了!
SQL> with t as2 (select to_char(empno) as aa3 from emp4 where deptno = 105 union all6 select dname || deptno7 from dept8 union all9 select ename10 from emp11 where deptno = 20)12 select *13 from (select aa, regexp_replace(aa, '[^[:digit:]]+') as nub from t)14 where nub is not null;AA NUB
------------------------------------------------------ --------------------------------------------------------------------------------
7782 7782
7839 7839
7934 7934
ACCOUNTING10 10
RESEARCH20 20
SALES30 30
OPERATIONS40 407 rows selected
当然了,你也可以用translate
来实现:
SQL> with t as2 (select to_char(empno) as aa3 from emp4 where deptno = 105 union all6 select dname || deptno7 from dept8 union all9 select ename10 from emp11 where deptno = 20)12 select *13 from (14 select translate(aa,'0123456789'||aa,'0123456789') nub15 from t16 )17 where nub is not null;NUB
--------------------------------------------------------------------------------
7782
7839
7934
10
20
30
407 rows selected
我这里写的都是简单写法,麻烦的也有,我就不写了,浪费时间不说,我还怕有人被我带偏了嘿嘿
🤣🤣🤣
总结
这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。
相关文章:
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...

数据库模式(schema)是什么?
在数据库的术语中,模式(schema)是一个逻辑概念,用于组织数据库中的对象。模式中的对象通常包括表、索引、数据类型、序列、视图、存储过程、主键、外键等等。 模式可以为数据库对象提供逻辑隔离功能,不用应用程序可以…...

出现failed to load steamui.dll如何解决?好的修复方法推荐
当你电脑突然出现failed to load steamui.dll的时候,你是否一脸懵逼?根本不知道发生啥时候,突然就会这样报错,其实造成这个原因,主要是因为问题出在steam上,我们还是有很多种方法可以解决的,今天…...
js 原生事件触发
var event nullevent new Event(input);document.querySelectorAll("input[placeholder点击网址 选择远端数据字典网址]")[0].dispatchEvent(event)...

Nacos安装配置(二)
目录 一、概述 二、Nacos 安装 A)Debian11 1)软件环境 2)下载源码或者安装包 3)mysql配置 4)启动服务器 B) Debian11 1) 安装JDK 2) 安装Maven 3) 安装Nacos2 4) 修改访问参数(/conf/applicati…...

【Linux基础知识】
Linux基础知识 Linux基础知识 系统目录结构 /bin: 命令和应用程序。 /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev : dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外…...

【王道数据结构】第七章| 查找 | 树
目录 一、查找 1、查找概念 2、顺序查找 3、折半查找 4、分块查找 二、树 1、B树 2、B树的基本操作 3、B树 4、散列查找及其性能分析 5、散列查找及性能分析 一、查找 1、查找概念 查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找。查找…...

VBA提高篇_19 可选参数Optional_ IsMissing _MSgbox
文章目录1. 可选参数Optional2.IsMissing判断参数是否提供,只能判断变体类型3. 使用 : 可以按参数名传递参数 a:1,c:34.Msgbox 常用参数5.VBA颜色常量表1. 可选参数Optional Optional 代表本参数是可选项 False ; 代表参数若不指定,则默认为False Function mySumProduct(r As R…...

【子网划分】求子网网络前缀、子网地址、每个子网可以分配给主机使用的最小地址和最大地址
1、某单位分配到一个地址块152.7.77.0/24,现在需要进一步划分为4个一样大的子网。(10分) 问题: (1) 每个子网的网络前缀有多长? (2) 每一个子网中有多少个地址? (3) 每一个子网的网络地址是什么?…...

网络协议安全
网络协议安全网络协议ISO/OSI七层模型OSI模型与TCP/IP模型网络接口与互联网层安全传输层与应用层安全传输层协议-TCP协议传输层协议-UDP协议网络协议 ISO/OSI七层模型 物理层 作用:定义物理链路的前期、机械、通信规程、功能要求等将比特流庄换成电压典型物理层设备…...

ImportError: /lib64/libm.so.6: version `GLIBC_2.23‘ not found问题解决方法
1.环境:Centos7,GCC version 9.1.0,python3.7,TensorFlow1.14.0.因为/usr/lib64/libstdc.so.6: version CXXABI_1.3.8 not found问题,我将GCC版本升级到了9.1.0,但是运行TensorFlow的时候出现了ImportError…...

盂县基本情况
寒假的活动报告,万物皆可CSDN,贴一下吧 盂县隶属于阳泉市,阳泉市是李彦宏和刘慈欣的家乡,阳泉市内有百度云计算中心 基本情况 盂县,隶属山西省阳泉市,地处山西省东部、太行山西麓,东与河北省平…...

VC++打开或关闭目标进程的声音(扬声器)(附源码)
VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…...
LeetCode 每日一题 2023/1/23-2023/1/29
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录1/23 2303. 计算应缴税款总额1/24 1828. 统计一个圆中点的数目1/25 1632. 矩阵转换后的秩1/26 1663. 具有给定数值的最小字符串1/27 2309. 兼具大小写的最好英文字母1/28 16…...
Hadoop组件Yarn常见命令
Hadoop组件Yarn常见命令 一、概述 当我们不能使用ResourceManager Web UI时,就需要使用Yarn命令来处理问题。因此,我们需要了解如何使用yarn命令监控YARN集群。 Hadoop的yarn命令具有广泛的使用范围: 它可以帮助我们管理大量的MR、Spark、Flink任务。例如获取和杀死正在运…...

QT之事件系统
QT之事件系统1. 概述2. 事件的传递3. 事件类型4. 事件处理与事件过滤5. 自定义事件5.1 Demo6. 发送事件7. 参考1. 概述 在QT中,事件均派生自QEvent抽象类,事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。 2. 事件的传递 …...

Python中__init__.py文件深入理解
Python中文件__init__.py深入理解1. 简介1.1 模块(Module)和包(Package)的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容2.2 __init__.py内容解释1. 简介 1.1 模块(Module)和…...

Jmeter之实现参数化的不同方式详解
参数化简介 定义:动态的获取、设置或生成数据,是一种由程序驱动代替人工驱动的数据设计方案,提高脚本的编写效率以及编写质量 适用场景:当提交的数据量较大时,每次修改太麻烦,可以使用参数化 本文介绍实现…...

Matlab论文插图绘制模板第76期—半对数刻度折线图(Semilogx和Semilogy)
在之前的文章中,分享了Matlab双对数刻度折线图的绘制模板: 进一步,再来分享一下半对数刻度折线图的绘制模板。 先来看一下成品效果: 特别提示:Matlab论文插图绘制模板系列,旨在降低大家使用Matlab进行科研…...
【找工作】永善县政务服务管理局公开招聘5名公益性岗位人员
【找工作】永善县政务服务管理局公开招聘5名公益性岗位人员 为贯彻落实《中华人民共和国就业促进法》《就业服务和就业管理规定》,帮助有劳动能力和就业愿望的就业困难人员实现就业,永善县政务服务管理局拟向社会公开招聘公益性岗位人员5名,…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...