使用不匹配字符串的通配符连接



>背景

我有两个表:

drugDistributionHistory - 详细说明了TI患者分发药物的内容/时间。

drugPrices - 药品价格。

对于这个例子,我正在研究名为"FLUOXETINE"的药物,也称为"百忧解"。

如果我在drugPrices表中查询这种药物,我会产生以下结果:

SELECT 
    drugName, 
    drugBrandName, 
    drugStrength, 
    drugDosage, 
    drugPrice 
FROM 
    drugPrices 
WHERE 
    drugName like '%fluoxetine%'

结果:

FLUOXETINE  PROZAC  10MG    CAP 0.02
FLUOXETINE  PROZAC  20MG    CAP 0.05

在我的drugDistributionHistory表中,我正在寻找这种相同类型的药物,但是,该药物的输入方式可能不同,例如:

select 
    drugName,
    strength,
    measurement 
from
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId
where
    f.facilityId = 40
    AND ddh.resultCode = 'Received'
    AND MONTH(dateGiven) = '01'
    AND YEAR(dateGiven) = '2014'
    and ddh.drugName like 'fluoxetine%'

订购方式 ddh.药物名称

结果:

Fluoxetine / Prozac 60.00   mg
Fluoxetine / Prozac 20.00   mg

问题

我试图将药物与其价格相匹配的查询如下所示。我正在尝试在drugNamedrugBrandName上匹配(即:百忧解是氟西汀的品牌药物):

select 
    drugName,
    strength,
    measurement 
from
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId
    INNER JOIN drugPrices dp ON
        ('%' + dp.drugName + '%' like '%' + ddh.drugName + '%' 
      OR '%' + dp.drugBrandName + '%' like '%' + ddh.drugName + '%')
where
    f.facilityId = 40
    AND ddh.resultCode = 'Received'
    AND MONTH(dateGiven) = '01'
    AND YEAR(dateGiven) = '2014' 
    and ddh.drugName like 'fluoxetine%'
order by 
    ddh.drugName

未找到结果。

我是否误解了连接表时使用通配符的方式?

我认为

INNER JOIN drugPrices dp ON
        ('%' + dp.drugName + '%' like '%' + ddh.drugName + '%' 
      OR '%' + dp.drugBrandName + '%' like '%' + ddh.drugName + '%')

应该是

INNER JOIN drugPrices dp ON
        (dp.drugName like '%' + ddh.drugName + '%' 
      OR dp.drugBrandName like '%' + ddh.drugName + '%')

请注意删除了源字段上的 % 符号。您只能在 LIKE 运算符的右侧使用这些运算符。

当然,这只会找到 dp.drugName 包含 ddh.drugName 或 dp.drugBrandName 包含 ddh 的结果。药物名称。这是可以接受的吗?

我怀疑您想考虑药物名称周围的分隔符以避免混淆(例如,因此"abc"与"abcd"不匹配)。 如果是这样,您可以按以下方式执行此操作:

from
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId
    INNER JOIN drugPrices dp ON
        (' ' + dp.drugName + ' ' like '% ' + ddh.drugName +  '%' 
      OR ' ' + dp.drugBrandName + ' ' like '% ' + ddh.drugName + ' %')

由于您确实将百分号放在LIKE运算符的两侧,我怀疑您错误地认为LIKE是对称的; 事实并非如此。您不会获得匹配项,因为'%Fluoxetine%''%Prozac%''%Fluoxetine / Prozac%' LIKE语句右侧的drugDistributionHistory表中。但是,如果您的操作数切换阵营,您将获得匹配项:

INNER JOIN drugPrices dp ON
    (ddh.drugName LIKE '%' + dp.drugName + '%'
  OR ddh.drugName LIKE '%' + dp.drugBrandName + '%')

LIKE的左侧不需要%符号。

最新更新