我在下面有一个字符串:
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 之前的任何内容。
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
请参阅演示。
要删除第一个_
之前的所有内容:
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
根据您使用的数据库(例如 SQL Server(,_
可能具有含义。
您可能希望转义 LIKE 语句中的下划线。
SQL Server 的示例
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 Server。如果您使用的是其他数据库,则可能也有办法转义该_
。