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

Php 带有转义字符和类似通配符的子字符串,php,mysql,sql,sql-like,Php,Mysql,Sql,Sql Like,我有一个字符串Test\u x\u T1,我想替换最后三个字符,即\u T1 如果字符串包含这三个字符,则返回null。 最后一个字符可以是\u T1、\u T2、\u 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 你应该试试这个: case when

我有一个字符串
Test\u x\u T1
,我想替换最后三个字符,即
\u T1
如果字符串包含这三个字符,则返回null。 最后一个字符可以是
\u T1、\u T2、\u 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 
你应该试试这个:

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

下划线是单字符搜索的通配符。
如果您的数据包含下划线(
\uu
),并且希望将其用作类似模式的一部分,则将其转义

示例

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)
试试这个

在“Test\ux\ut1”像“%\\ut\uu”escape”时选择case
然后是substr(trim('Test_x_x_T1'),1,长度(trim('Test_x_x_T1'))-3)
否则,从双字节结束为空

如果要在
T
之前匹配
\uuu
,则应将其转义,因为
\uu
对like运算符具有预定义的含义


如果未转义
,则即使此字符串
Test\u x\u xT1
也将返回非空结果。

我在您的回答中得到空值。即使我使用Test\u x\u xT1,它也会返回值,改为使用文字下划线:“%T\u1”