いろいろな薬の名前がついたプロジェクトに取り組んでいます。多くの場合、私はProscratinolやProscratinol XR(拡張リリース)のようなものを見つけるでしょう。この性質のすべての名前を取得するクエリを見つけて、「親」の薬をテーブルに入れ、これらの「子」の薬に参照させることができるようにしたいので、薬の数を数えるクエリを作成するときに、 XR、CR、およびその他のバージョンがあるため、Proscratinolを二重にカウントしていません。私はそれを突き刺すために次のように書いた
;with x
as
(
select drug_name
from rx
group by drug_name
)
select distinct *
from x,x as x2
where LEFT(x2.drug_name,5) = LEFT(x.drug_name,5)
and x.drug_name !=x2.drug_name
これにより、名前が最初の5文字を共有するすべての薬のリストが表示されます。ここでは5つは完全に任意です。私がこれまでに得たものは十分にうまくいきますが、私は結果を降順で並べたいと思います。ですから、左から読んでいるXのほとんどの文字が同じであることを確認したいと思います。
たとえば、フェニトインとフェピルは3になります(最初の3文字は同じです)
; xを使用(drug_nameでrxグループからdrug_nameを選択)
select x.drug_name as xDrugName
,x2.drug_name as x2DrugName
,case when LEFT(x2.drug_name,6) = LEFT(x.drug_name,6)
then LEN(left(x.drug_name,6)) else '0' end
from x,x as x2
where LEFT(x2.drug_name,5) = LEFT(x.drug_name,5)
and x.drug_name !=x2.drug_name
group by x.drug_name,x2.drug_name
上記のクエリでintをleft関数にハードコーディングする代わりに、2つの文字列が共有する類似文字の数を返す整数式が必要です。これを行うための良い方法はありますか?