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.