多个LIKE子句SQL

jfe*_*042 2 sql t-sql sql-server

我正在进行一项询问,以显示某些类型药物的患者.我有一份我正在寻找的几种不同药物的清单 - 我正在寻找数据库中是否有任何患者的处方,这些药物在今天或之后的日期或之后结束.

药物按名称出现在表格中,所以我试图找到它们LIKE.但是,一旦我添加了多个med,我的查询就会爆出大量的重复项(从362行返回到超过32K行),并WHERE在meds之后忽略我的子句中的所有项.

所以这就是我尝试过的:

    select p.PatientID, 
    p.FirstName+' '+p.LastName as 'PatientName', 
    m.endDate, 
    m.Prescriber, 
    m.drugDescription as 'DrugName'
    from Medications m
    join Patients p on p.RCDID = m.PTID
    where m.historyRecord = 'N'
    and m.[current] = 'Y'
    and m.drugDescription like 'Med1%'
    or m.drugDescription like 'Med2%'
    or m.drugDescription like 'Med3%'
    and m.endDate >= GETDATE()
Run Code Online (Sandbox Code Playgroud)

这给了我超过30K的重复 - 并且重复的患者在该WHERE条款中不符合以下标准:

    where m.historyRecord = 'N'
    and m.[current] = 'Y'        
    and m.endDate >= GETDATE()
Run Code Online (Sandbox Code Playgroud)

(而这名患者实际上只出现在21行的数据库中 - 在21次不同的时间内开出Med2 - 所以它完全脱离了轨道)

我也尝试了一个子查询:

    select p.PatientID, 
    p.FirstName+' '+p.LastName as 'PatientName', 
    m.endDate, 
    m.Prescriber, 
    m.drugDescription as 'DrugName'
    from Medications m
    join Patients p on p.RCDID = m.PTID
    where m.historyRecord = 'N'
    and m.[current] = 'Y'
    and exists (select 1 from Medications m1
                where m1.PTID = m.PTID
                and m1.drugDescription like 'Med1%'
                or m1.drugDescription like 'Med2%'
                or m1.drugDescription like 'Med3%'
                and m1.endDate >= GETDATE())
Run Code Online (Sandbox Code Playgroud)

这就是我要找的东西:

PatientID | PatientName | endDate   | Prescriber | DrugName
1         | John Smith  | 2017-10-22| Dr. Jones  | Med1
1         | John Smith  | 2017-10-22| Dr. Jones  | Med3
2         | Mary Doe    | 2017-11-01| Dr. Johnson| Med2
3         | Steve Doe   | 2017-11-15| Dr. Smith  | Med1
Run Code Online (Sandbox Code Playgroud)

有什么建议?我已经做了一些挖掘并且还没有完全打击任何有效的东西,所以我们非常感谢您的想法!

Gor*_*off 5

你需要括号!

where m.historyRecord = 'N' and
      m.[current] = 'Y' and
      m.endDate >= GETDATE() and
      (m.drugDescription like 'Med1%' or
       m.drugDescription like 'Med2%' or
       m.drugDescription like 'Med3%'
      )
Run Code Online (Sandbox Code Playgroud)

如果你正在学习SQL,混合时总是使用括号andor.

  • @AlanBurstein...你可以,如果你真的相信描述有那些名字.我猜这些药物有其他名字. (2认同)