ltrim() 函式的缺陷

zhanglei_itput發表於2010-10-21
 
    今天同事問了一個問題,如果一列,想把最後'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
這個的功能應該都知道的噢~~  再來看一個:
SQL> select ltrim('10900094323','109') from dual;
LTRIM('10900094323','109')
---------------------------
4323
是不是有點迷糊了?按道理說應該是00094323的結果嘛~~  再來看兩個對比的:
SQL> select ltrim('10900111000991110224323','109') from dual;
LTRIM('10900111000991110224323
------------------------------
224323
SQL> select ltrim('109200111000991110224323','109') from dual;
LTRIM('10920011100099111022432
------------------------------
200111000991110224323
是不是有這樣的疑問:為什麼第二個查詢語句多了一個2就沒被截了呢?
再來看一個:

SQL> select ltrim('902100111000991110224323','109') from dual;
LTRIM('90210011100099111022432
------------------------------
2100111000991110224323

我想大家都都會想:按道理說是截109的值,為什麼90也被截了?
總結:ltrim(x,y) 函式是按照y中的字元一個一個截掉x中的字元,並且是從左邊開始執行的,只要遇到y中有的字元, x中的字元都會被截掉, 直到在x的字元中遇到y中沒有的字元為止函式命令才結束 .
網友回答: 函式將109當成了三個字元以1,0,9在字串開始直道出現不為1,0,9這三個字元中的任意一個開始擷取;
可以看出,ltrim函式是從匹配函式開始之後出現在子串中任何字元都被遮蔽掉了;
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9252210/viewspace-676456/,如需轉載,請註明出處,否則將追究法律責任。

相關文章