このアプローチでは、数値ジェネレーターを使用し、オーバーラップの長さをテストするだけです:
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
これは information_schema.columns
長い薬物名を表示するのに十分な行があります。
これは x
を結合します それ自体に変換してから、数値のリストに結合します。 where
句は次の 3 つの条件をチェックしています。(1) 各薬剤名の左側の部分が seqnum まで同じであること。 (2) 各薬物名の長さが seqnum 以下であること。
次に、集計は各ペアを取得し、seqnum の最大値を選択します。これは、最長の部分文字列一致である必要があります。