Как проверить наличие одного из значений, разделённых разделителем, в поле строки SQL Oracle
Дано: находим поле (например select field5 from table1 where id = 123456) его значение: Q;W;R;T;TY.
Надо: найти в нём значение "T", чистое "T", не наличие "T" вообще, а наличие "T" разделённого ";".
Т.е. например мне надо в селект добавить условие, что есть "T" в поле field5.
Спасибо!
Ответы (3 шт):
Можно попробовать использовать следующий синтаксис:
SELECT
field5
FROM
table1
WHERE
id = 123456
AND название_поля_с_искомым_содержимым LIKE 'T;';
Оператор LIKE используется для сравнения строк. В отличие от операторов отношения равно = и не равно <>, LIKE позволяет сравнивать строки не на полное совпадение (не совпадение), а в соответствии с шаблоном. Шаблон может включать обычные символы и символы-шаблоны. При сравнении с шаблоном, его обычные символы должны в точности совпадать с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки.
| Символ-шаблон | Описание | Пример |
|---|---|---|
| % | Любая строка, содержащая ноль или более символов | SELECT * FROM book WHERE author LIKE '%М.%' выполняет поиск и выдает все книги, инициалы авторов которых содержат «М.» |
| _ (подчеркивание) | Любой одиночный символ | SELECT * FROM book WHERE title LIKE 'Поэм_' выполняет поиск и выдает все книги, названия которых либо «Поэма», либо «Поэмы» и пр. |
CREATE TABLE test (id INT, txt VARCHAR2(255)); INSERT INTO test VALUES (1, 'Q;W;R;T;TY'); INSERT INTO test VALUES (2, 'Q;W;R;TT;TY');
SELECT id, txt, INSTR(';' || txt || ';', ';T;') is_present FROM testID | TXT | IS_PRESENT -: | :---------- | ---------: 1 | Q;W;R;T;TY | 7 2 | Q;W;R;TT;TY | 0
db<>fiddle here
Еще как вариант можно применить REGEXP_LIKE:
with table1 as (
select 'Q;W;R;T;TY' as field5,
12345 as id
from dual
union
select 'Q;W;R;TY' as field5,
12345 as id
from dual
union
select 'Q;W;R;T' as field5,
12345 as id
from dual
union
select 'T' as field5,
12345 as id
from dual)
select field5
from table1
where id = 12345
and regexp_like(field5, '(^|;)T(;|$)');