簡體   English   中英

SQL比較相似的列

[英]SQL comparing similar columns

我有兩列可能包含相似的數據,並且我試圖找出如何比較兩者的相似性。

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,此測試失敗。

為了澄清起見,我將“相似”定義如下:如果兩個術語都包含相同的詞,則它們是相似的。 即使該詞是通用名稱(例如“ insurance”),也是如此,因此“ B保險公司”類似於“ A保險公司”,原因有兩個:“ Insurance”和“ Company”。

我認為您的問題中隱含了很多特定領域的知識(即“相似”名稱的確切含義),並且您將無法通過通用比較來解決此問題。 最好的選擇可能是在查詢中枚舉您的特定要求,這將使您能夠精確控制所得到的:

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

編輯

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM