带有转义字符和类似通配符的子字符串

时间:2014-03-21 09:50:40

标签: php mysql sql sql-like

我有一个字符串Test_x_x_T1,我想替换最后三个字符,_T1 如果字符串包含这三个字符,否则返回null。 最后的字符可以是_T1, _T2,_T3

但我总是空着

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 

4 个答案:

答案 0 :(得分:2)

Underscore是单字符搜索的外卡 如果您的数据包含下划线(_),并希望将其用作类似模式的一部分,那么请将其转义。

示例

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)

答案 1 :(得分:0)

你应该试试这个:

case when 'Test_x_x_T1' like '%[_]%T_'

您需要在'_'之前匹配字符串的第一部分。

答案 2 :(得分:0)

我认为你过于复杂了。

 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

答案 3 :(得分:0)

试试这个

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将返回非空结果。