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

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

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

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