Мне нужен следующий результат:
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. который не совпадает с другой строкой.