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, чтобы проверить несколько таких параметров, как:
case
when InsuranceCompany1 like '%' + InsuranceCompany2 + '%' then 'TRUE'
when InsuranceCompany2 like '%' + InsuranceCompany1 + '%' then 'TRUE'
else 'FALSE'
end AS Result
Но этот тест не проходит для PatientID 333333333 и 777777777 и выше.
Для пояснения я определю "похожие" следующим образом: два термина похожи, если каждый из них содержит одно и то же слово. Это применимо, даже если слово является родовым (например, "страхование"). Таким образом, "Страховая компания B" похожа на "Страховая компания A" по двум причинам: "Страхование" и "Компания".
2 ответа
Я думаю, что в вашем вопросе есть много специфических для предметной области знаний (о том, что именно представляет собой "похожие" имена), и вы не сможете решить эту проблему с помощью сравнения общего назначения. Ваш лучший вариант, вероятно, состоит в том, чтобы перечислить ваши конкретные требования в вашем запросе, что позволит вам точно контролировать, что вы получаете:
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...
редактировать
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