我正在从事一个具有各种药物名称的项目。通常,我会找到类似 Proscratinol 和 Proscratinol XR(延长版)的东西。我想找到一个查询来获取所有这种性质的名称,这样我就可以将“父”药物放在一个表中并让这些“子”药物引用它,所以当我编写查询来进行药物计数时,我不要重复计算前列素,因为它有 XR、CR 和任何其他版本。我写了以下内容以尝试一下
;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
这将给我一个名称共享前五个字母的所有药物的列表。五在这里完全是任意的。到目前为止我所做的已经足够好,但我想按降序排列结果。所以我想找到他们从左边读取的 X-most 字符是相同的。
例如 Phenytoin 和 Phepil 为 3(它们的前三个字母相同)
;with x as (select drug_name from rx group by 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 函数中,而是需要该整数表达式来返回两个字符串共享多少相似字符。有什么好方法可以做到这一点?