Как функция не разбирается правильно в SQL - PullRequest
1 голос
/ 29 апреля 2019

У меня есть строка ниже:

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 для других строк, которые у меня есть.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

LIKE '%_TTT_%' означает, что существует TTT внутри строки с любым символом до и любым символом после него.
Если вы хотите указать символ подчеркивания, вам нужно его избежать:

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

Edit:
Если вы хотите удалить все до 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

См. Демоверсию .
Чтобы удалить все до 1-го _:

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 
1 голос
/ 29 апреля 2019

В зависимости от базы данных, которую вы используете, например, 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. Если вы используете другую базу данных, у вас также может быть способ избежать этого _.

...