Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Trova tutte le stringhe che condividono almeno X caratteri, ordinate per somiglianza

Questo approccio utilizza un generatore di numeri e quindi verifica solo la lunghezza della sovrapposizione:

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

Ciò presuppone che information_schema.columns dispone di righe sufficienti per i nomi dei farmaci più lunghi.

Questo si unisce a x a se stesso e quindi si unisce a un elenco di numeri. Il where la clausola sta verificando tre condizioni:(1) che la parte sinistra del nome di ogni farmaco sia la stessa fino al seqnum; (2) che la lunghezza di ciascun nome di farmaco sia inferiore o uguale a seqnum.

L'aggregazione prende quindi ogni coppia e sceglie il valore più alto di seqnum:questa dovrebbe essere la corrispondenza della sottostringa più lunga.