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

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

sinye56 2024-09-19 02:08 4 浏览 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学习日记——单表查询

相关推荐

Linux在线安装JDK1.8

首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...

Linux安装JDK,超详细

1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...

Linux安装jdk1.8(超级详细)

前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...

Linux系统安装JDK教程

下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...

干货|JDK下载安装与环境变量配置图文教程「超详细」

1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...

Linux下安装jdk1.8

一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...

Linux上安装JDK

以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...

Linux系统的一些常用目录以及介绍

根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...

Linux系统目录结构

一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...

Linux文件查找

在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...

嵌入式linux基本操作之查找文件

对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...

linux系统查看软件安装目录的方法

linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...

Linux下如何对目录中的文件进行统计

统计目录中的文件数量...

Linux常见文件目录管理命令

touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...

Linux常用查找文件方法总结

一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...

取消回复欢迎 发表评论: