背景
我有两张桌子:
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
问题
我试图将药物与其价格相匹配的查询看起来像这样。我试图匹配drugName
或drugBrandName
(即: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
未找到任何结果。
我是否在连接表时误解了如何使用通配符?
答案 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
的左侧不需要%
个标志。