Как вернуть разницу между двумя строками, используя только Oracle SQL - PullRequest
1 голос
/ 10 апреля 2020

У меня есть 2 строки, например:

  • 'Источник: Siebel; Имя: Мэри Джейн; Пол: F; Возраст: 24; Н;»
  • 'Источник: Siebel; Имя: Мари; Пол: F; Возраст: 24; N; '

Мне нужен следующий результат:

  • Имя: Мэри Джейн;
  • Имя: Мари;

Скорее всего, мне нужно изменить ниже код

with cte1 as  (
    select 1 id, 'Source:Siebel; Name:Mary Jane; Gender:F; Age:24; N;' str from dual
    union all
    select 2 id, 'Source:Siebel; Name:Marie; Gender:F; Age:24; N;' str from dual
), cte2 as (
    SELECT distinct id, trim(regexp_substr(str, '[^ ]+', 1, level)) str
    FROM cte1 t
    CONNECT BY instr(str, ' ', 1, level - 1) > 0
)
select distinct t1.str
from cte2 t1
join cte2 t2 on (t1.str = t2.str and t1.id != t2.id)

от Oracle Функция для возврата сходства между строками

, в результате чего было схожесть [QueryResult] из 2 строки

enter image description here

Я не могу использовать процедуру, так как мне нужен этот SQL скрипт для запуска в Oracle Fusion

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Мне нужен следующий результат:

Name:Mary Jane; 
Name:Marie;

Вы можете использовать LAG/LEAD аналитическую функцию , чтобы получить желаемый результат.

Демонстрация с несколькими входными значениями, например, 'Mary Jane', 'Mar ie', 'Jane', 'Jones'

with t1 as  (
    select 1 id, 'Source:Siebel; Name:Mary Jane; Gender:F; Age:24; N;' str from dual
    union all
    select 2 id, 'Source:Siebel; Name:Marie; Gender:F; Age:24; N;' str from dual
    union all
    select 3 id, 'Source:Siebel; Name:Jane; Gender:F; Age:24; N;' str from dual
    union all
    select 4 id, 'Source:Siebel; Name:Jones; Gender:F; Age:24; N;' str from dual
), t2 as (
SELECT t1.id,
        trim(regexp_substr(t1.str, '[^;]+', 1, lines.column_value)) str
    FROM t1,
      TABLE (CAST (MULTISET
      (SELECT LEVEL FROM dual
              CONNECT BY instr(t1.str, ';', 1, LEVEL) > 0
      ) AS sys.odciNumberList ) ) lines
    ORDER BY id, lines.column_value)
select id, str from(
  select id, 
         str, 
        lag(str) over(partition by str order by str) lag, 
        lead(str) over(partition by str order by str) lead from t2
) where lag is null
  and   lead is null
order by id;

        ID STR
---------- -----------------------
         1 Name:Mary Jane
         2 Name:Marie    
         3 Name:Jane     
         4 Name:Jones

Это даст вам разницу между любыми атрибутами в строке name, возраст, пол и др. c. который не совпадает с другой строкой.

0 голосов
/ 10 апреля 2020

Поможет ли это?

SQL> with cte1 as  (
  2   select 1 id, 'Source:Siebel; Name:Mary Jane; Gender:F; Age:24; N;' str from dual
  3   union all
  4   select 2 id, 'Source:Siebel; Name:Marie; Gender:F; Age:24; N;' str from dual
  5   ),
  6  cte2 as
  7    (select id,
  8       column_value lvl,
  9       trim(regexp_substr(str, '[^;]+', 1, column_value)) str
 10     from cte1 cross join
 11       table(cast(multiset(select level from dual
 12                           connect by level <= regexp_count(str, ';') +1
 13                          ) as sys.odcinumberlist))
 14    )
 15  select a.str, b.str
 16  From cte2 a join cte2 b on a.id < b.id and a.lvl = b.lvl and a.str <> b.str;

STR             STR
--------------- ---------------
Name:Mary Jane  Name:Marie

SQL>
...