Сравнение значений одного столбца с пробелами между ними с другим в Oracle PL / SQL - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужно сравнить значения одного столбца со значениями другого столбца в приведенной ниже таблице «БРЕНД».Я попытался рассмотреть длину одной строки между двумя столбцами, но, несмотря на это .. значения в столбцах различаются, и поэтому он дает неверный результат.

Таблица BRAND:

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

Мне нужно вернуть строки, которые имеют значение False, поскольку между столбцами brand_1 и brand_2 нет соответствия.Столбец Status не существует в данных;Я добавил это здесь, чтобы продемонстрировать, какие строки считаются ложными и должны быть возвращены.Этот столбец также не должен присутствовать в выводе.

Вывод:

 ID        brand_1             brand_2     
------------------------------------------- 
4          GIF                 APP GIF       
5          GHY PPA             GHY PPA ABC   
6          MNC CGA IPK         GIT ABC ITY   

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 02 декабря 2018

Вот один из способов (не самый быстрый, но простой в написании и обслуживании).Идея состоит в том, чтобы разбить каждую входную строку на ее компоненты, отсортировать их в алфавитном порядке и затем собрать их.Я делаю это, используя 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 (при условии, что входные строки не могут быть нулевыми; если они могут быть нулевыми, вам придется обрабатывать их в соответствии с потребностями вашего бизнеса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...