我有一个字符串Test_x_x_T1
,我想替换最后三个字符,即_T1
如果字符串包含这三个字符,否则返回null。最后一个字符可以是_T1, _T2,_T3
但是我总是得到null
select
case when 'Test_x_x_T1' like '[_]%T_'
then substring(trim('Test_x_x_T1'),1,length(trim('Test_x_x_T1'))-2)
else null end test
下划线是单个字符搜索的通配符。
如果您的数据包含下划线(_
),并且希望将其用作like模式的一部分,则转义它。
:
mysql> select * from (
-> select 1 rnum, 'Test_x_x_T1' t
-> union all
-> select 2, 'Test_x_xT1_'
-> union all
-> select 3, 'Test_x_xT1'
-> union all
-> select 4, 'Test_x_x_T1_'
-> ) tst
-> where t like '%'_T_';
+------+-------------+
| rnum | t |
+------+-------------+
| 1 | Test_x_x_T1 |
+------+-------------+
1 row in set (0.00 sec)
你应该试试这个:
case when 'Test_x_x_T1' like '%[_]%T_'
您需要匹配字符串的第一部分,在'_'之前。
我认为你把事情弄得太复杂了。
select
case when 'Test_x_x_T1' like '%_T_'
then substring(trim('Test_x_x_T1'),1,length(trim('Test_x_x_T1'))-3)
else null end test
试试这个
select case when 'Test_x_x_T1' like '%'_T_' escape '''
then substr(trim('Test_x_x_T1'),1,length(trim('Test_x_x_T1'))-3)
else null end from dual
如果在T
之前匹配_
,则应该转义,因为_
具有类似操作符的预定义含义。
如果_
没有转义,即使这个字符串Test_x_xT1
也将返回非空结果。