【问题标题】:Joining with wildcard not matching strings加入通配符不匹配的字符串
【发布时间】:2014-02-18 17:18:16
【问题描述】:

背景

我有两张桌子:

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

drugPrices - 药品价格。

对于这个例子,我正在研究一种名为“氟西汀”的药物,也称为“百忧解”。

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

问题

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

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

没有找到结果。

我是否误解了在加入表格时如何使用通配符?

【问题讨论】:

  • 我认为最大的误解是您认为这是个好主意。你为什么不加入药物 ID?
  • 不幸的是,数据来自两个完全不同的系统,我唯一能加入的就是药物的名称。

标签: sql sql-server join wildcard


【解决方案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 "您只在 LIKE 运算符的右侧使用 % 符号。"
【解决方案2】:

我怀疑您想在表格中考虑药物名称周围的分隔符以避免混淆(例如,“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 + ' %')

【讨论】:

    【解决方案3】:

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

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

    LIKE 的左侧不需要% 符号。

    【讨论】:

    • 如果你不确定数据质量,你也应该做一个修剪:ddh.drugName LIKE '%' + LTRIM(RTRIM(dp.drugName)) + '%'.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多