2013-11-19 7 views
0

У меня есть два столбца, которые могут содержать похожие данные, и я пытаюсь выяснить, как сравнивать как сходства.SQL, сравнивающий аналогичные столбцы

TABLE: 
PatientID | InsurnaceCompany1 | InsuranceCompany2 
111111111 | Medicaid   | Medicaid - Part D 
222222222 | Medicaid - ABC Co | Medicaid 
333333333 | Medicaid - ABC Co | Medicaid - Part D 
444444444 | MVP Insurance  | MVP 
555555555 | Medicare   | Medicaid 
666666666 | Medicaid   | MVP 
777777777 | Private - MVP  | MVP Option 

Вопрос, Как сравнить два столбца, чтобы знать, если они похожи.

Результаты должны быть что-то вроде:

PatientID | InsurnaceCompany1 | InsuranceCompany2 | Result 
111111111 | Medicaid   | Medicaid - Part D | TRUE 
222222222 | Medicaid - ABC Co | Medicaid   | TRUE 
333333333 | Medicaid - ABC Co | Medicaid - Part D | TRUE 
444444444 | MVP Insurance  | MVP    | TRUE 
555555555 | Medicare   | Medicaid   | FALSE 
666666666 | Medicaid   | MVP    | FALSE 
777777777 | Private - MVP  | MVP Option  | TRUE 

я могу использовать случай заявление, чтобы проверить некоторые из этих вариантов, как:

case 
    when InsuranceCompany1 like '%' + InsuranceCompany2 + '%' then 'TRUE' 
    when InsuranceCompany2 like '%' + InsuranceCompany1 + '%' then 'TRUE' 
    else 'FALSE' 
end AS Result 

Но этот тест не для PatientID 333333333 и 777777777 выше.

Для уточнения, я определю «аналогичный», как показано ниже: оба термина аналогичны, если в каждом из них содержится одно и то же слово. Это относится, даже если слово является общим (например, «страхование»). Таким образом, «Страховая компания B» похожа на «Страховую компанию A» по двум причинам: «Страхование» и «Компания».

+4

как вы определяете «похожи»? –

+0

Аналогично, если какая-либо часть (слово) первой страховой компании находится во втором или наоборот. Т.е.: если «медикаида» появляется где-то в обеих колонках, то они похожи. Аналогично, если «MVP» появляется где-то в обоих столбцах, то они похожи. – ajspacemanspiff

+0

Что делать, если «страховка» появляется в обеих колонках? –

ответ

-2

Редактировать

DECLARE @t TABLE (PatientID INT, InsurnaceCompany1 NVARCHAR(50), InsuranceCompany2 NVARCHAR(50)) 

INSERT INTO @t 
VALUES 
(111111111,'Medicaid'   ,'Medicaid - Part D'), 
(222222222,'Medicaid - ABC Co' ,'Medicaid'), 
(333333333,'Medicaid - ABC Co' ,'Medicaid - Part D'), 
(444444444,'MVP Insurance'  ,'MVP'), 
(555555555,'Medicare'   ,'Medicaid'), 
(666666666,'Medicaid'   ,'MVP'), 
(777777777,'Private - MVP'  ,'MVP Option') 


SELECT PatientID, InsurnaceCompany1, InsuranceCompany2 , 
    CASE WHEN LEFT(InsurnaceCompany1,CASE WHEN CHARINDEX(' ', InsurnaceCompany1) = 0 
        THEN LEN(InsurnaceCompany1) ELSE CHARINDEX(' ', InsurnaceCompany1) END) 
      = LEFT(InsuranceCompany2,CASE WHEN CHARINDEX(' ', InsuranceCompany2) = 0 
       THEN LEN(InsuranceCompany2) ELSE CHARINDEX(' ', InsuranceCompany2) END) 
       THEN 'TRUE' ELSE 'FALSE' END AS RESULT 
FROM @t 

Результат Набор

PatientID InsurnaceCompany1 InsuranceCompany2 RESULT 
111111111 Medicaid   Medicaid - Part D TRUE 
222222222 Medicaid - ABC Co Medicaid   TRUE 
333333333 Medicaid - ABC Co Medicaid - Part D TRUE 
444444444 MVP Insurance  MVP     TRUE 
555555555 Medicare   Medicaid   FALSE 
666666666 Medicaid   MVP     FALSE 
777777777 Private - MVP  MVP Option   FALSE 
+1

Я в замешательстве ... разве это не означает, что любой столбец может быть чем угодно? 'InsurnaceCompany1 like '%'' –

+0

InsuranceCompany1 like '%' + InsuranceCompany2 + '%' в вопросе не возвращает True или False. –

+0

и ...? что это значит? как ваш код помогает? –

0

Я думаю, что есть много знаний о предметной области конкретной (о том, что именно представляет собой "аналогичные" имена) подразумеваемые в вашем вопросе, и вы не сможете решить это с помощью общего назначения. Ваш лучший вариант, вероятно, перечислить ваши конкретные требования в запросе, что позволит вам контролировать то, что вы получаете:

select 
    * 
from 
    patients 
where 
    InsuranceCompany1 like concat('%', InsuranceCompany2, '%') or 
    InsuranceCompany2 like concat('%', InsuranceCompany1, '%') or 
    (InsuranceCompany1 like '%medicaid%' and InsuranceCompany2 like '%medicaid%') or 
    (InsuranceCompany1 like '%medicare%' and InsuranceCompany2 like '%medicare%') or 
    (InsuranceCompany1 like '%mvp%' and InsuranceCompany2 like '%mvp%') or 
    ...etc... 

http://sqlfiddle.com/#!2/9de7b/13

+1

Это не сработает, к сожалению, если что-то новое придет (скажем, новая страховая компания), поскольку оно будет жестко закодировано в логике – ajspacemanspiff

+0

Не шутите, но Первоначальное требование «подобия» настолько расплывчато, что это единственный практический способ его решения. Вы можете комбинировать парсер, основанный на словах, который дает вам положительный результат, когда любое слово в одном поле соответствует любому слову в другом поле, но это все равно будет терпеть неудачу, когда вы получите пациента, у которого есть «North Fairfield Insurance» и «South Fairfield» Страхование». – jokeeffe

+0

Я бы подумал, что «North Fairfield Insurance» и «South Fairfield Insurance» похожи на то, что у них есть «Фарифилд» и «Страхование» от их имени. – ajspacemanspiff

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