Вот один из способов (не самый быстрый, но простой в написании и обслуживании).Идея состоит в том, чтобы разбить каждую входную строку на ее компоненты, отсортировать их в алфавитном порядке и затем собрать их.Я делаю это, используя lateral
(таким образом, каждая строка обрабатывается независимо от других строк), JSON
трюк для разделения строк и LISTAGG
для их объединения.
with
brand (id, brand_1, brand_2) as (
select 1, 'SAC' , 'SAC' from dual union all
select 2, 'APP BBB' , 'BBB APP' from dual union all
select 3, 'ABC OND DEG', 'DEG ABC OND' from dual union all
select 4, 'GIF' , 'APP GIF' from dual union all
select 5, 'GHY PPA' , 'GHY PPA ABC' from dual union all
select 6, 'MNC CGA IPK', 'GIT ABC ITY' from dual
)
select id, brand_1, brand_2,
case when b1 = b2 then 'True' else 'False' end as status
from brand,
lateral( select listagg(token, ' ') within group (order by token) as b1
from json_table( '["' || replace(brand_1, ' ','","') || '"]',
'$[*]' columns(token varchar2 path '$'))
),
lateral( select listagg(token, ' ') within group (order by token) as b2
from json_table( '["' || replace(brand_2, ' ','","') || '"]',
'$[*]' columns(token varchar2 path '$'))
)
;
ID BRAND_1 BRAND_2 STATUS
-- ----------- ----------- ------
1 SAC SAC True
2 APP BBB BBB APP True
3 ABC OND DEG DEG ABC OND True
4 GIF APP GIF False
5 GHY PPA GHY PPA ABC False
6 MNC CGA IPK GIT ABC ITY False
Редактировать : Чтобы получить желаемый результат в вопросе отредактированный , удалите выражение case
из предложения SELECT
и добавьте предложение WHERE
в конце запроса: ... where b1 != b2
(при условии, что входные строки не могут быть нулевыми; если они могут быть нулевыми, вам придется обрабатывать их в соответствии с потребностями вашего бизнеса).