2015-12-15 16 views
5

Giả sử tôi có một bảng các chuỗi, như thế này:SQL: Chọn chuỗi mà có lời bình đẳng

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

Tôi muốn tìm chuỗi có lời bình đẳng. Tập kết quả phải giống như

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

hoặc ít nhất một cái gì đó như thế này. Bạn có thể trợ giúp không?

+2

RDBMS là gì? Bạn làm một số mẫu phù hợp ở đây mà một số RDBMS đã xây dựng trong các chức năng mà có thể giúp đỡ. – xQbert

+0

@xQbert Tôi đang sử dụng Oracle 11g. – Mike

+0

Xem các hàm [UTL_Match] (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS352). Có một số chức năng phù hợp phong nha ở đó. – xQbert

Trả lời

7

Một phương pháp là sử dụng một hack cho biểu thức thông thường:

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

Bạn có thể muốn các trường hợp là giống hệt nhau:

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

Tôi đang cố chạy truy vấn này, nhưng tôi nhận được lỗi rằng t2 là số nhận dạng không hợp lệ (trong phần thay thế). – Mike

+1

Tôi nghĩ rằng anh ta có nghĩa là t1.val và t2.val 'trên regexp_like (t1.val, thay thế (t2.val, '', '|');' – xQbert

1

Bạn có thể sử dụng kết hợp SUBSTRING và LIKE.

sử dụng charIndex ("") để tách các từ trong chuỗi con nếu đó là những gì bạn muốn làm.

1

Sử dụng một số các [oracle similiarity nội] tìm thấy trong UTL_Match (https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS71219) khớp với nhau ...

Logic này phù hợp hơn với tên hoặc mô tả tương tự '' và cách phát âm hoặc typo có thể gây ra anh ghi lại không khớp.

Bằng cách điều chỉnh .5 bên dưới, bạn có thể thấy cách% giúp bạn gần gũi hơn và gần hơn với các kết quả phù hợp hoàn hảo.

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 

và ảnh chụp màn hình truy vấn/đầu ra.

Hoặc chúng ta có thể sử dụng một bên tham gia và> nếu chúng ta chỉ muốn compairisons một cách ...

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 

này sẽ trả về 3 hồ sơ mong muốn.

But this does not explicitly check each any word matches. là yêu cầu cơ sở của bạn. Tôi chỉ muốn bạn biết về các lựa chọn thay thế.

enter image description here

Các vấn đề liên quan