Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Trouver toutes les chaînes qui partagent au moins X caractères, triées par ressemblance

Cette approche utilise un générateur de nombres, puis teste simplement la longueur du chevauchement :

select x.drug_name, x2.drug_name, MAX(c.seqnum) as OverlapLen
from x cross join
     x x2 cross join
     (select ROW_NUMBER() over (order by (select NULL)) seqnum
      from INFORMATION_SCHEMA.COLUMNS c
     ) c
where LEFT(x.drug_name, c.seqnum) = LEFT(x2.drug_name, c.seqnum) and
      len(x.drug_name) >= c.seqnum and len(x2.drug_name) >= c.seqnum
group by x.drug_name, x.drug_name
order by x.drug_name, OverlapLen desc

Cela suppose que information_schema.columns contient suffisamment de lignes pour les noms de médicaments plus longs.

Cela joint x à lui-même, puis se joint à une liste de numéros. Le where clause vérifie trois conditions :(1) que la partie gauche de chaque nom de médicament est la même jusqu'au seqnum ; (2) que la longueur de chaque nom de médicament est inférieure ou égale à seqnum.

L'agrégation prend ensuite chaque paire et choisit la valeur la plus élevée de seqnum -- cela devrait être la correspondance de sous-chaîne la plus longue.