加入不匹配字符串的通配符

时间:2014-02-18 17:18:17

标签: sql sql-server join wildcard

背景

我有两张桌子:

drugDistributionHistory - 详细说明药物分发给患者的时间/时间。

drugPrices - 药物价格。

对于这个例子,我正在研究名为“FLUOXETINE”的药物,也称为“PROZAC”。

如果我在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.drugName

结果:

Fluoxetine / Prozac 60.00   mg
Fluoxetine / Prozac 20.00   mg

问题

我试图将药物与其价格相匹配的查询看起来像这样。我试图匹配drugNamedrugBrandName(即:PROZAC是FLUOXETINE的品牌药):

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

未找到任何结果。

我是否在连接表时误解了如何使用通配符?

3 个答案:

答案 0 :(得分:1)

我认为

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.DrugName的结果。这可以接受吗?

答案 1 :(得分:1)

我怀疑你想要考虑药品名称周围的分隔符以避免混淆(例如,所以“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 + ' %')

答案 2 :(得分:0)

由于您确实在LIKE运算符的两边放了百分号,我怀疑您错误地认为LIKE是对称的;它不是。您无法获得匹配,因为'%Fluoxetine%''%Prozac%'都不匹配'%Fluoxetine / Prozac%'语句右侧drugDistributionHistory表中的LIKE。但是,如果您的操作数切换到一边,您将获得匹配:

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

LIKE的左侧不需要%个标志。