2015-12-15 4 views
5

Пусть у меня есть таблица строк, например:SQL: Выберите строки, которые имеют одинаковые слова

VAL 
----------------- 
Content of values 
Values identity 
Triple combo 
my combo 
sub-zero combo 

Я хочу, чтобы найти строки, которые имеют одинаковые слова. Результирующий набор должен быть похож на

VAL    MATCHING_VAL 
------------------ ------------------ 
Content of values Values identity 
Triple combo  My combo 
Triple combo  sub-zero combo 

или хотя бы что-то вроде этого. Вы можете помочь?

+2

Что такое РСУБД? Здесь вы делаете несколько шаблонов, которые некоторые RDBMS встроили в функции, которые могли бы помочь. – xQbert

+0

@xQbert Я использую Oracle 11g. – Mike

+0

Посмотрите на функции [UTL_Match] (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS352). Там есть некоторые достойные функции соответствия. – xQbert

ответ

7

Один из способов заключается в использовании хака для регулярных выражений:

select t1.val, t2.val 
from t t1 join 
    t t2 
    on regexp_like(t1.val, replace(t2.val, ' ', '|'); 

Вы могли бы хотеть так, чтобы быть идентичными, а также:

 on regexp_like(lower(t1.val), replace(lower(t2.val), ' ', '|'); 
+0

Я пытаюсь запустить этот запрос, но я получаю ошибку, что t2 является недопустимым идентификатором (в части замены). – Mike

+1

Я думаю, что он означает t1.val и t2.val 'on regexp_like (t1.val, replace (t2.val, '', '|');' – xQbert

1

Вы можете использовать комбинацию SUBSTRING и LIKE.

использовать charIndex (""), чтобы разбить слова в подстроке, если это то, что вы хотите сделать.

1

Используя некоторые из [оракула внутреннего similiarity] найдено в UTL_Match (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS71219) Соответствие ...

Эта логика больше подходит для сопоставления имен или описаний, которые являются «похожими», и где фонетические варианты написания или опечатки могут вызывать t он записывает, что не подходит.

При помощи настройки .5 ниже вы можете увидеть, как% приближает вас ближе к идеальным совпадениям.

with cte as (
select 'Content of values' val from dual union all 
select 'Values identity' val from dual union all 
select 'triple combo' from dual union all 
select 'my combo'from dual union all 
select 'sub-zero combo'from dual) 

select a.*, b.*, utl_match.edit_distance_similarity(a.val, b.val) c, UTL_MATCH.JARO_WINKLER(a.val,b.val) JW 
from cte a 
cross join cte b 
where UTL_MATCH.JARO_WINKLER(a.val,b.val) > .5 
order by utl_match.edit_distance_similarity(a.val, b.val) desc 

и скриншот запроса/вывода.

Или мы могли бы использовать внутреннее соединение и> если мы хотим один способ compairisons ...

select a.*, b.*, utl_match.edit_distance_similarity(a.val, b.val) c, UTL_MATCH.JARO_WINKLER(a.val,b.val) JW 
from cte a 
inner join cte b 
    on A.Val > B.Val 
where utl_match.jaro_winkler(a.val,b.val) > .5 
order by utl_match.edit_distance_similarity(a.val, b.val) desc 

это возвращает 3 нужные записи.

But this does not explicitly check each any word matches. который был вашим базовым требованием. Я просто хотел, чтобы вы знали об альтернативах.

enter image description here

Смежные вопросы