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
我在下面有一个字符串:
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