当前位置: 首页 > news >正文

【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
怎么做???
这么做!
分两步:

  1. 把ename拆分为单个字母显示。
  2. 把多行数据合并为一行显示。

下面先处理一行数据

  • 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开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…...

数据库模式(schema)是什么?

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

出现failed to load steamui.dll如何解决?好的修复方法推荐

当你电脑突然出现failed to load steamui.dll的时候&#xff0c;你是否一脸懵逼&#xff1f;根本不知道发生啥时候&#xff0c;突然就会这样报错&#xff0c;其实造成这个原因&#xff0c;主要是因为问题出在steam上&#xff0c;我们还是有很多种方法可以解决的&#xff0c;今天…...

js 原生事件触发

var event nullevent new Event(input);document.querySelectorAll("input[placeholder点击网址 选择远端数据字典网址]")[0].dispatchEvent(event)...

Nacos安装配置(二)

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

【Linux基础知识】

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

【王道数据结构】第七章| 查找 | 树

目录 一、查找 1、查找概念 2、顺序查找 3、折半查找 4、分块查找 二、树 1、B树 2、B树的基本操作 3、B树 4、散列查找及其性能分析 5、散列查找及性能分析 一、查找 1、查找概念 查找&#xff1a;在数据集合中寻找满足某种条件的数据元素的过程称为查找。查找…...

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&#xff0c;现在需要进一步划分为4个一样大的子网。&#xff08;10分&#xff09; 问题&#xff1a; (1) 每个子网的网络前缀有多长&#xff1f; (2) 每一个子网中有多少个地址&#xff1f; (3) 每一个子网的网络地址是什么&#xff1f…...

网络协议安全

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

ImportError: /lib64/libm.so.6: version `GLIBC_2.23‘ not found问题解决方法

1.环境&#xff1a;Centos7&#xff0c;GCC version 9.1.0&#xff0c;python3.7&#xff0c;TensorFlow1.14.0.因为/usr/lib64/libstdc.so.6: version CXXABI_1.3.8 not found问题&#xff0c;我将GCC版本升级到了9.1.0&#xff0c;但是运行TensorFlow的时候出现了ImportError…...

盂县基本情况

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

VC++打开或关闭目标进程的声音(扬声器)(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…...

LeetCode 每日一题 2023/1/23-2023/1/29

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录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中&#xff0c;事件均派生自QEvent抽象类&#xff0c;事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。 2. 事件的传递 …...

Python中__init__.py文件深入理解

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

Jmeter之实现参数化的不同方式详解

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

Matlab论文插图绘制模板第76期—半对数刻度折线图(Semilogx和Semilogy)

在之前的文章中&#xff0c;分享了Matlab双对数刻度折线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下半对数刻度折线图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研…...

【找工作】永善县政务服务管理局公开招聘5名公益性岗位人员

【找工作】永善县政务服务管理局公开招聘5名公益性岗位人员 为贯彻落实《中华人民共和国就业促进法》《就业服务和就业管理规定》&#xff0c;帮助有劳动能力和就业愿望的就业困难人员实现就业&#xff0c;永善县政务服务管理局拟向社会公开招聘公益性岗位人员5名&#xff0c;…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...