就像函数在 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 之前的任何内容。

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。如果您使用的是其他数据库,则可能也有办法转义该_

相关内容

  • 没有找到相关文章

最新更新