2015-12-15 5 views
5

を持って選択した文字列は次のように、私は文字列のテーブルがあるとします。結果セットはSQL:</p> <pre><code>VAL ----------------- Content of values Values identity Triple combo my combo sub-zero combo </code></pre> <p>私は同じ言葉を持っている文字列を検索したい:同じ言葉

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

のようにするか、少なくともこのようにしてください。 お手伝いできますか?

+2

これは何RDBMSのですか?いくつかの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

私は彼がregexp_like(t1.val、replace(t2.val、 ''、 '|'); onのt1.valとt2.val ' – xQbert

1

SUBSTRINGとLIKEの組み合わせを使用できます。

charIndex( "")を使用して、実行したいことがある場合は部分文字列内の単語を分割します。

1

[Oracle内部similiarity]の一部を使用しましたUTL_Match(https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS71219)に一致する...

このロジックは、名前が「類似」であり、表音綴りや誤字がt彼は一致しないと記録する。

%を調整することで、%があなたを近づけて完璧なマッチに近づける様子を見ることができます。

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 

とquery/outputのスクリーンショットです。

それとも我々は一方向のみの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

関連する問題