2015-12-15 12 views
5

Angenommen haben habe ich eine Tabelle von Strings, wie folgt aus:SQL: Wählen Sie Strings, die gleich Wörter

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

Ich möchte Strings finden, die gleichen Worte. Das Ergebnis sollte wie folgt sein:

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

oder zumindest so etwas. Können Sie helfen?

+2

Welche RDBMS ist das? Du machst hier einige Muster, die einige RDBMS in Funktionen eingebaut haben, die helfen könnten. – xQbert

+0

@xQbert Ich benutze Oracle 11g. – Mike

+0

Schauen Sie sich die [UTL_Match] (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS352) Funktionen an. Es gibt einige anständige übereinstimmende Funktionen dort. – xQbert

Antwort

7

Eine Methode ist ein Hack für reguläre Ausdrücke zu verwenden:

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

Sie könnte der Fall sein, gleich wie auch wollen:

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

Ich versuche, diese Abfrage auszuführen, aber ich bekomme den Fehler, dass t2 eine ungültige Kennung ist (im ersetzenden Teil). – Mike

+1

Ich denke, er meint t1.val und t2.val 'on regexp_like (t1.val, ersetzen (t2.val, '', '|');' – xQbert

1

Sie könnten eine Kombination aus SUBSTRING und LIKE verwenden.

Verwenden Sie charIndex (""), um die Wörter in der Teilzeichenfolge aufzuteilen, wenn dies das ist, was Sie tun möchten.

1

einige der [Orakel interne similiarity] Verwendung gefunden in UTL_Match (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS71219) passender ...

Diese Logik ist mehr für passende Namen oder Beschreibungen, die "ähnlich" sind und wo phonetische Schreibweisen oder Tippfehler t verursachen können er zeichnet nicht überein.

Durch die Anpassung der .5 unten können Sie sehen, wie die% Sie näher an perfekte Übereinstimmungen bringen.

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 

und Screenshot der Abfrage/Ausgabe.

Oder wir könnten eine innere verwenden beitreten und> wenn wir nur einen Weg compairisons wollen ...

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 

dies gibt die 3 gewünschten Datensätze.

But this does not explicitly check each any word matches. das war Ihre Grundvoraussetzung. Ich wollte nur, dass Sie Alternativen kennen.

enter image description here