百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle学习日记——应用字符串(oracle字符串函数大全)

mhr18 2024-10-08 04:18 19 浏览 0 评论

1.遍历字符串

--level:伪列 和connect by 结合使用

select level from dual connect by level <= 5

得到结果

level

1

2

3

4

5

connect by是树形查询的一个子句,后面的level是一个伪列,用来表示树形查询的级次关系,通过level <= 5循环5次,达到上述效果。level也可以作为定位标识使用

eg 需要对字符串 “天天向上” 和“TTXS”进行循环,达到下述效果

创建视图:create or replace view v

as

select '天天向上' as 汉字,'TTXS' as 首拼 from dual;

需要对字符串 “天天向上” 和“TTXS”进行循环,达到下述效果

天 T

天 T

向 X

上 S

思路:(1).通过level加上定位标识

select v.汉字,v.首拼,level from v connect by level <= length(v.汉字);

(2).每一行取对应位置的字符,通过substr截取字符串 substr(字段名,开始位置,截取长度) eg:substr(name,2,3):从name第2个字段开始截取3个长度

select substr(v.汉字,level,1) as 汉字拆分,substr(v.首拼,level,1) as 首拼拆分 from v connect by level <= length(v.汉字);

2.字符串文字中包含 '

在写sql时字符串内的'处理方式,其实只要写两个 ''就可以

eg:select 'a''b''b' from dual

查询结果: a'b'b

3.计算字符在字符串中出现的次数

使用regexp_count 函数

eg:

创建视图:create or replace view v

as

select 'clerk,king,miller' as str from dual;

查询,的数量

select regexp_count(str,',') from v;

4.从字符串中删除不需要的字符

(1)

(2)

(3)regexp_replace(字段名,'[需要被替代的值]')

5.将字符和数字数据分离

eg:销售订单单据号是字母和数字混合的字符串,用下面的写法可以把字母和数字分离

用正则表达式:[0-9] 和 [^0-9] 来进行筛选

select regexp_replace(vbillcode,'[0-9]','') shuzi,

regexp_replace(vbillcode,'[^0-9]','') so

from so_saleorder

6.查询只含字母或数据型的数据

在一个字段的值中,有些数据为数字,有些数据为字母,有些数据既包含数字,又包含字母,甚至包含一些特殊符号,比如$等

现在要求返回只包含数字和字母的值。

方案1:直接用正则表达式 ^[0-9a-zA-Z]+$

创建以下视图作为案例

create or replace view v as

select '123' as data from dual union all

select 'abc' from dual union all

select '123abc' from dual union all

select 'abc1' from dual union all

select '%$a1b3c' from dual union all

select 'a 2' from dual;

eg:select data from v where regexp_like(data,'^[0-9a-zA-Z]+

)

首先和前面一样,regexp_like对应普通的like

regexp_like(data,'[ABC]')就相当于(like '%A%' or like '%B%' or like '%C%')

regexp_like(data,^[0-9a-zA-Z])就相当于(like '%数字%' or like '%小写字母%' or like '%大写字母%')

注意;是前后都有%的模糊查询

"^"不在方括号表示字符串的开始,这里还有一个$,在方括号外面,表示字符串的结束。

另一个概念是'+' 和 '*','*' 表示匹配前面的子表达式零次或多次

创建以下视图作为案例

create or replace view v as

select '167' as str from dual union all

select '1234567' as str from dual

regexp_like(str,'16+'),'+'前的子表达式是 6,至少匹配6一次,也就相当于(like '16%' or like '166%' or ...) 等价于 like '16%'

regexp_like(str,'16*'),'*'前的表达式是6,至少匹配6零次,相当于(like '1%' or like '16%' or ...) 等价于like '1%'.

select * from v where regexp_like(str,'16+')

select * from v where regexp_like(str,'16*')

7.提取姓名的大写首字母缩写

要求返回下面view中的大写字母,中间加'.',显示为'H.M'

create or replace view v as

select 'Michael Hartstein' as al from dual

方案1:利用regexp_replace的分组替换功能

select regexp_replace(v.al,'([[:upper:]])(.*)([[:upper:]])(.*)','\1.\3') as sx from v

括号()将子表达式分组为一个替换单元、量词单元或后向引用单元。

在这个查询中,我们用()把字符串分成了四个组,其中第1、3组是大写字母,然后通用后向引用(\1.\3')就分别取到了两个组的大写字母,并在中间增加了字符"."

8.按字符串中的数值排序

建立如下view,要求按其中的数字排序

方案1:把其中的数字取出来,作为一列,进行排序

方案2:用translate函数,直接替换掉非数字字符,进行排序

9.根据表中的行创建一个分隔列表

eg:工资表按照部门求和,需要体现出这个部门中的人名

方案1:用listagg分析函数

select

deptno,

sum(sal) as total_sal,

listagg(ename,',') within group(order by ename) as total_ename

from emp

group by deptno;

和sum一样,listagg在这里起汇总的作用。sum的作用是把数值的结果加到一起,而listagg是把字符串结果连在一起。

10.提取第n个分隔的子串

建立如下视图

create or replace view v as

select listagg

11.分解IP地址

eg:把192.168.1.131从.进行分隔

方案1:用regexp_substr()按照.进行分割,分别取1、2、3、4

select regexp_substr(v.ip,'[^.]+',1,1) a,

regexp_substr(v.ip,'[^.]+',1,2) b,

regexp_substr(v.ip,'[^.]+',1,3) c,

regexp_substr(v.ip,'[^.]+',1,4) d

from (select '192.168.1.131' as ip from dual) v

12.将分隔数据转换为多值IN列表

假设前端传入了一个字符串列表(如:CLARK,KING,MILLER),要求根据这个串查询数据

直接带入肯定不能查询,需要进行转换,这就是正则表达式的优势

建立如下视图:

create or replace view v as

select 'CLARK,KING,MILLER' as emps from dual;

查询伪列以及正则表达式

select regexp_substr(v.emps,'[^,]+',1,level) as ename,

level,

'regexp_substr('''||v.emps || ''',''[^,]+'',1,'|| to_char(level)||')' as reg,

(length(translate(v.emps,','||v.emps,','))+1) as a

from v

connect by level <= (length(translate(v.emps,','||v.emps,','))+1)

13.按字母顺序排列字符串

将emp.name中的内容按字母顺序重新排序,如:ADAMS>AADMS.对于这种问题

(1).将name拆分未单个字母显示

(2).把多行数据显示为一行

先以一行数据为例:

用substr()进行分割,用level伪列进行循环标记

var v_ename varchar2(50);

exec :v_ename := 'ADAMS';

select :v_ename as ename,substr(:v_ename,level,1) as c from dual

connect by level <= length(:v_ename) ;

select 'ADAMS' as ename,substr('ADAMS',level,1) as c from dual

connect by level <= length('ADAMS') ;

用listagg()进行拼接

select 'ADAMS' as ename,listagg(substr('ADAMS',level,1)) within group(order by substr('ADAMS',level,1))

as c from dual

connect by level <= length('ADAMS') ;

以销售订单为例:把销售订单的订单号进行重新排序

select vbillcode,

(select listagg(substr(vbillcode,level,1)) within group(order by substr(vbillcode,level,1)) from dual

connect by level <= length(vbillcode)) as new_vbillcode

from so_saleorder

如果需要对重新排列的结果进行去重,如何操作?

在标量子查询中加一个group by即可

select vbillcode,

(select listagg(min(substr(vbillcode,level,1))) within group (order by min(substr(vbillcode,level,1))) from dual

connect by level <= length(vbillcode) group by substr(vbillcode,level,1)) as new_vbillcode from so_saleorder

Oracle学习日记——给查询结果排序

Oracle学习日记——单表查询

相关推荐

甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入

IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...

甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云

IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...

Spring Boot 自定义数据源设置,这些坑你踩过吗?

你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...

一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

低代码建模平台-数据挖掘平台(低代码平台的实现方式)

现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...

navicat 17.2.7连接oracle数据库提示加载oracle库失败

系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...

开源“Windows”ReactOS更新:支持全屏应用

IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...

SSL 推出采用全模拟内置混音技术的模拟调音台Oracle

英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...

47道网络工程师常见面试题,看看有没有你不会的!

你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...

汉得信息:发布EBS系统安装启用JWS的高效解决方案

e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...

36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!

前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

手把手教你在嵌入式设备中使用SQLite3

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...

JAVA语言基础(java语言基础知识)

一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...

取消回复欢迎 发表评论: