1 概述
1. 区别: '截断(删除)的位置不同、指定字符个数不同'
(1) trim() :截断 '左、右' 两边出现的任何指定字符,最多只能指定 '一个字符'
(2) ltrim():截断 '左' 边出现的任何指定字符,可指定 '多个字符'
(3) rtrim():截断 '右' 边出现的任何指定字符,可指定 '多个字符'
-- 若无给定字符,默认 '空格'
2. 不足:'无法截断(删除)中间位置的字符',可通过其它替代方案
2 语法
示例1:缺省时,默认截断 "空格"
-- '|' : 方便观察
select '|' || trim(' a b c ') || '|' a, -- |a b c|
'|' || ltrim(' a b c ') || '|' b, -- |a b c |
'|' || rtrim(' a b c ') || '|' c -- | a b c|
from dual;
示例2:截断指定字符
select ltrim('abYaYba', 'a') l1, -- byayba
rtrim('abYaYba', 'a') r1, -- abyayb
ltrim('abYaYba', 'ab') l2, -- yayba
rtrim('abYaYba', 'ab') r2 -- abyay
from dual;
-- 也可由 trim() 替代,不过写法比较麻烦,而且 trim() 只能指定 '一个字符'
select trim(leading 'a' from 'abYaYba') l1, -- byayba
trim(trailing 'a' from 'abYaYba') r1, -- abyayb
trim(both 'a' from 'abYaYba') b -- byayb
from dual;
3 扩展
上述的案例中,我们可以看到 '左截断、右截断、左右两边截断'
但如果想 '仅删除中间' 指定字符该如何处理呢?
示例:(写法有很多,以下仅供参考)
--****************************************
-- 思路: '源字符串' = 左截断 + 中间 + 右截断
-- 再单独处理 '中间' 的字符串
-- 最后和左、右 字符串拼接得到最终的结果
--****************************************
with t_demo as
(select 'aabYaYbaa' str_source, 'a' str_target from dual),
t_deal_with_string as
(select t.str_source,
t.str_target,
trim(both t.str_target from t.str_source) str_middle,
replace(trim(both t.str_target from t.str_source), t.str_target) str_middle_new,
replace(t.str_source, ltrim(t.str_source, t.str_target)) str_left,
replace(t.str_source, rtrim(t.str_source, t.str_target)) str_right
from t_demo t)
select t.str_source 源字符串,
t.str_target 给定字符,
(t.str_left || t.str_middle_new || t.str_right) 替换后字符串
from t_deal_with_string t;
输出结果:
1 aabYaYbaa a aabYYbaa