Фильтровать данные по строкам в Oracle

В таблице tab1 есть данные, как показано ниже.

Col1   Col2  Message (Value can be concatenation of multi messages string after "Hello there" can vary)
-----------------------------------------------------------
I1     L1    Message1|Message2|Hello there D1,D2,D3
I2     L2    Message1|MessageN|Hello there D3,D4,D1
I3     L3    Hello there D3,D5
I4     L4    Message3|Message4
I5     L5    Hello there DN,DN+1

Мне нужно выбрать только записи со строкой «Привет!» и никаких других сообщений, таких как Сообщение 1,2 .. N и т. д. (должны быть выбраны только 3-я и 5-я записи)

Может ли кто-нибудь помочь с эффективным способом сделать это? Я пробую, как показано ниже, но это не дает желаемого результата.

select * from tab1 t1 where message like '%Hello there%' 
and not exists (select 1 from tab1 t2 where t1.col1=t2.col1 and t1.col2 =t2.col2 and ???)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот почему вы не получаете никакого результата:

and not exists (select 1 from tab1 t2 where t1.col1=t2.col1 and t1.col2 =t2.col2 and ???)

Вы выбираете цифру 1; это утверждение всегда будет истинным, а это значит, что оно всегда будет существовать. Поскольку вы хотите выбрать сообщения, когда они «не существуют», они не получат никаких данных.

Судя по предоставленной вами информации, вам нужны только записи, начинающиеся с «Привет». В этом случае вам нужно просто заменить подобный запрос с «%Hello there%» на «Hello there%».

select * from tab1 t1 where message like 'Hello there%'

Этот запрос выберет все записи, в которых данные поля сообщения начинаются с «Привет».

Это также будет соответствовать таким сообщениям, как 'Hello there DN,DN+1|Message6'.

MT0 03.08.2024 12:53

Спасибо @MT0. Ты прав. Возможно я не правильно понял вопрос.

Dharmin S 03.08.2024 17:22
Ответ принят как подходящий

Найдите строки, содержащие только один термин (т. е. без разделителя терминов), которые начинаются с нужной фразы:

SELECT *
FROM   tab1
WHERE  message LIKE 'Hello there%'
AND    message NOT LIKE '%|%'

или, возможно, менее эффективно:

SELECT *
FROM   tab1
WHERE  REGEXP_LIKE(message, '^Hello there[^|]*$')

Что для примера данных:

CREATE TABLE tab1 (Col1, Col2, Message) AS
SELECT 'I1', 'L1', 'Message1|Message2|Hello there D1,D2,D3' FROM DUAL UNION ALL
SELECT 'I2', 'L2', 'Message1|MessageN|Hello there D3,D4,D1' FROM DUAL UNION ALL
SELECT 'I3', 'L3', 'Hello there D3,D5' FROM DUAL UNION ALL
SELECT 'I4', 'L4', 'Message3|Message4' FROM DUAL UNION ALL
SELECT 'I5', 'L5', 'Hello there DN,DN+1' FROM DUAL UNION ALL
SELECT 'I6', 'L6', 'Hello there DN,DN+1|Message6' FROM DUAL;

Оба вывода:

COL1 COL2 СООБЩЕНИЕ я3 Л3 Привет, D3, D5. I5 Л5 Здравствуйте, DN, DN+1

рабочий пример

where instr(message, 'Hello there') = 1 and instr(message, '|') = 0

тоже сделаю работу

Другие вопросы по теме