今天同事问了一个问题,如果一列,想把最后'45'两个字符串去掉,该如何写,我当时想了两个办法,不过都有一些缺陷:
1. select replace('12345','45','') from dual;
--123
缺陷:如果前面的字符串中还有45,而不是最后两位的话,也会被替换成空。
2. select rtrim('12345','45') from dual;
--123
缺陷:如果倒数第三位是4或5,也会被截掉,因为ltrim(x,y) 函数是按照y中的字符一个一个截掉x中的字符,并且是从左边开始执行的,只要遇到y中有的字符, x中的字符都会被截掉, 直到在x的字符中遇到y中没有的字符为止函数命令才结束 .
e.g.
SQL> select ltrim('109224323','109') from dual;
LTRIM('109224323','109')
------------------------
224323
------------------------
224323
这个的功能应该都知道的噢~~ 再来看一个:
SQL> select ltrim('10900094323','109') from dual;
LTRIM('10900094323','109')
---------------------------
4323
---------------------------
4323
是不是有点迷糊了?按道理说应该是00094323的结果嘛~~ 再来看两个对比的:
SQL> select ltrim('10900111000991110224323','109') from dual;
LTRIM('10900111000991110224323
------------------------------
224323
------------------------------
224323
SQL> select ltrim('109200111000991110224323','109') from dual;
LTRIM('10920011100099111022432
------------------------------
200111000991110224323
------------------------------
200111000991110224323
是不是有这样的疑问:为什么第二个查询语句多了一个2就没被截了呢?
再来看一个:
SQL> select ltrim('902100111000991110224323','109') from dual;
LTRIM('90210011100099111022432
------------------------------
2100111000991110224323
------------------------------
2100111000991110224323
我想大家都都会想:按道理说是截109的值,为什么90也被截了?
总结:ltrim(x,y) 函数是按照y中的字符一个一个截掉x中的字符,并且是从左边开始执行的,只要遇到y中有的字符, x中的字符都会被截掉, 直到在x的字符中遇到y中没有的字符为止函数命令才结束 .
网友回答: 函数将109当成了三个字符以1,0,9在字符串开始直道出现不为1,0,9这三个字符中的任意一个开始截取;
可以看出,ltrim函数是从匹配函数开始之后出现在子串中任何字符都被屏蔽掉了;
可以看出,ltrim函数是从匹配函数开始之后出现在子串中任何字符都被屏蔽掉了;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9252210/viewspace-676456/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9252210/viewspace-676456/