Like 函数在 sql 中无法正确解析

Like function not parsing correctly in sql

我在下面有一个字符串:

string_col

FT PROMOTED TREND - TTT_TLMW+_WER_TEST_TEST_TEsT_TEST CHECK_ANOTHER_NA_TEST_TEST: TEST_TEST_TEST_TEST_FIVE

如果条件适用,我下面的函数应该删除第一个 _ 和它之前的任何内容:_TTT_ 出现。

当我写函数时:

CASE WHEN string_col LIKE '%_TTT_%' THEN RIGHT(string_col, LENGTH(string_col) - CHARINDEX('_', string_col)) ELSE string_col END new_string_col

输出在不应该删除开头的 TTT_:

TLMW+_WER_TEST_TEST_TEsT_TEST CHECK_ANOTHER_NA_TEST_TEST: TEST_TEST_TEST_TEST_FIVE

预期的输出应该没有变化。

知道为什么会这样吗?

编辑:

14_TTT_two_dmeD

在 [_] 两边加上方括号不会删除我拥有的其他行的 TTT 之前的任何内容。

根据您使用的数据库,例如 SQL 服务器,_ 可能有 meaning.

您可能希望转义 LIKE 语句中的下划线。

SQL 服务器示例

create table test (
  string_col varchar(1000)
);
insert into test values ('FT PROMOTED TREND - TTT_TLMW+_WER_TEST_TEST_TEsT_TEST CHECK_ANOTHER_NA_TEST_TEST: TEST_TEST_TEST_TEST_FIVE');
insert into test values ('FT PROMOTED TREND2 - _TTT_TLMW+_WER_TEST_TEST_TEsT_TEST CHECK_ANOTHER_NA_TEST_TEST: TEST_TEST_TEST_TEST_FIVE');

结果

select * from test
where string_col LIKE '%_TTT_%';

会给你2个结果。

select * from test
where string_col LIKE '%[_]TTT[_]%';

会给你1个结果。

也许您的查询应该如下所示

select
    CASE
    WHEN string_col LIKE '%[_]TTT[_]%' THEN RIGHT(string_col, LEN(string_col) - CHARINDEX('_', string_col))
    ELSE string_col
    END new_string_col
from test;

如果您使用的是 SQL 服务器。如果您使用的是不同的数据库,您可能也有办法逃避 _

LIKE '%_TTT_%' 表示字符串中存在 TTT,其前有任何字符,后有任何字符。
如果要指定下划线字符,需要转义:

LIKE '%[_]TTT[_]%'

编辑:
如果你想删除 TTT_ 之前的所有内容:

CASE 
    WHEN string_col LIKE '%_TTT[_]%' 
      THEN RIGHT(string_col, LEN(string_col) - CHARINDEX('TTT_', string_col) + 1) 
      ELSE string_col 
END new_string_col

参见demo
要删除第一个 _:

之前的所有内容
RIGHT(string_col, LEN(string_col) - CHARINDEX('_', string_col) + 1)

编辑:

select 
  CASE 
    WHEN string_col LIKE '%_TTT[_]%' 
      THEN RIGHT(string_col, LEN(string_col) - CHARINDEX('TTT_', string_col) + 1) 
    WHEN string_col LIKE '%_DSD[_]%' 
      THEN RIGHT(string_col, LEN(string_col) - CHARINDEX('DSD_', string_col) + 1) 
    ELSE string_col 
  END new_string_col
from tablename