Oracle之trim( )、ltrim( )、rtrim( )三个函数的用法及陷阱

2023-10-05 21:18

本文主要是介绍Oracle之trim( )、ltrim( )、rtrim( )三个函数的用法及陷阱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近整理一份oracle常用函数清单的时候发现其经常用来去除字符串空格的三个函数,也就是trim()、ltrim()、rtrim(),看起来简简单单,其实大有玄机。以下见解来自网络,但内容经由博主撰写并验证,尽量确保准确无误。

trim()、ltrim()、rtrim()三个函数有两个作用,分别是:

一、去除字符串前后空格(基本用法)

trim(string):去除指定字符串string的左右空格,当然,string中间有空格的时候是不会被去除的

SELECT trim('    aaa  bbb  ccc     ')  trim FROM dual;

TRIM

-------

aaa  bbb  ccc


ltrim(string)、rtrim(string):分别去除指定字符串string左侧和右侧的空格

SELECT ltrim('    aaa  bbb  ccc     ') ltrim FROM dual;

LTRIM

---------

aaa  bbb  ccc     (注意,此时返回的字符串右侧是有空格的)


SELECT rtrim('    aaa  bbb  ccc     ') rtrim FROM dual;

RTRIM

---------

   aaa  bbb  ccc(显然此时返回的字符串左侧是有空格的)


病灶时间:字符串左右的空格真的可以全部都去掉吗?不见得。如果你的字符串两侧带有全角空格,你就会惊奇的发现,全角空格完全去不掉!包括Java中trim()方法,对于字符串前后的全角空格也是无能为力。

将输入法切换到中文输入法,并且在打空格的时候使用全角,你就会发现,原来去空格不是我们想的那样简单,并不是见着字符串左右的空白都能用这三个方法简单的去掉。至于原因,推测应该与字符编码集有关,全角空格是占两个字节,即 2 bytes,而半角空格是只占一个字节,这意味着他们使用的并不是同一个编码集。而这三个函数,包括Java中的trim()方法,可能只是简单的根据ASCII中的“空格”编码来左右删除空格。(以上推测部分未经严格验证,有兴趣的朋友可以验证一下告诉我一声)

那么如果真的在字符串中遇到了全角空格,有办法去除掉吗?有的,待会就讲。


二、去除字符串左右 / 中指定字符(进阶用法)

去除空格仅仅是这三个函数的“默认行为”,事实上,这三个函数还可以接收其他的参数来完成在指定字符串左右 / 中去除字符。


trim( leading | trailing | both string1 FROM string2):从string2中去除左侧 | 右侧 | 左侧两侧(默认是both,即左右侧都去掉)的string1字符,注意,string1只能是单个字符。


SELECT trim(leading  '  '  from  '    aaa  bbb  ccc   ') leadingtrim FROM dual;

LEADINGTRIM

---------------------

aaa  bbb  ccc   (注意,此时返回的字符串右侧是有空格的)

SELECT trim(trailing  '  '  from  '    aaa  bbb  ccc   ') trailingtrim FROM dual;

TRAILINGTRIM

---------------------

    aaa  bbb  ccc(显然,此时返回的字符串左侧是有空格的)


SELECT trim(both '  '  from  '    aaa  bbb  ccc   ') bothtrim FROM dual;

BOTHTRIM

----------------

aaa  bbb  ccc(返回的字符串两侧的空格都被去掉)

(注意,以上三个示例中,如果都是要完成“去空格”的话,可以简写成 trim( leading | trailing | both  FROM string),即省略空格。)

前面介绍的全角空格不能去除的问题,在这里就可以得到解决了,即将string1也写成全角空格,这样,我们就是”从string2这个左右带全角空格的字符串中将左右的全角空格去掉”了。你看,so EZ。


ltrim(string1,string2),rtrim(string1,string2):从字符串string1左侧(右侧)开始去除与string2字符集合单个字符匹配的字符,直到在string1中遇上某个字符,该字符不在string2字符集合中

这段话读起来有点拗口,但是对于真正理解这两个函数的用法至关重要。oracle中的这两个函数中的第二个参数,可以是多个字符组成的“字符集合”,为什么说是“字符集合”而不是“字符串”(虽然严格意义上讲并没有字符集合这个概念),因为在以string2为基础对string1做字符去除的时候,string2并不是作为一个字符串那样的整体来与string1匹配的,而是单个单个字符的匹配。比如string1='abccba',string2='abc',如果string2作为一个整体来匹配,显然不管是用ltrim还是rtrim函数,对string1操作之后返回的结果应该是'cba',但实际上不是,返回的是一个空串!


SELECT ltrim('abccba','abc') ltrim FROM dual;

LTRIM

--------

(返回的是空串)


SELECT rtrim('abccba','abc') rtrim FROM dual;

RTRIM

--------

(返回的是空串)


而至于“直到在string1中遇上某个字符,该字符不在string2字符集合中”这句话,则是体现ltrim函数和rtrim函数区别的时候。我们在上面两个例子的基础上对string1稍作改动,在string1中加个“x”:


SELECT ltrim('abcxcba','abc') ltrim FROM dual;

LTRIM

--------

xcba(结果并不是只剩一个“x”,而是包括stirng1中“x”以及右侧的字符)


SELECT rtrim('abcxcba','abc') rtrim FROM dual;

RTRIM

--------

abcx(结果并不是只剩一个“x”,而是包括stirng1中“x”以及左侧的字符)


ltrim函数从string1左侧往右读,左侧前三个字符分别在string2中找到了对应的单个字符匹配,所以都被去除掉,读到“x”的时候,没有匹配上,所以从这开始到string1右侧都被保留并返回;相反,rtrim函数从string2右侧往左读,右侧前三个字符分别在string2中找到了对应的单个字符匹配,所以都被去掉,读到“x”的时候,没有匹配上,所以从这开始到string1左侧都被保留并返回。


由此类推,如果string1中左侧(右侧)第一个字符在string2中找不到对应,那么ltrim(rtrim)函数将会把string1字符串完整返回:


SELECT ltrim('    abcxcba','abc') ltrim FROM dual;

LTRIM

--------

   abcxcba(string2中并没有空格这个字符串,所以string1带着左侧空格完整返回了)


病灶时间:可能有些朋友在使用trim()、ltrim()、rtrim()这三个函数的进阶用法的时候会出现一个问题,即“我明明指定以空格为条件去除原字符串,为什么返回的是一个空串”,可能的原因是错把“空串”当“空格”。“空串”指的是两个单引号之间什么也没有(即 '' ,看起来跟英文输入法里面一个双引号一样),而“空格”指的是两个单引号之间有个空格(即 '  ',这个看起来就不像英文输入法里面的双引号了)。如果使用的是空串,原字符串会被去的干干净净的!


这篇关于Oracle之trim( )、ltrim( )、rtrim( )三个函数的用法及陷阱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152071

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的