包含多个CASE语句的SQL查询

时间:2017-05-30 18:39:30

标签: sql sql-server sql-server-2012 case

我目前正在处理一些数据,显示所有在诊所接受过某种手术的患者。此程序类别由若干代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量举措表明患者应在一定时间内完成其中一项手术;问题在于,每个人都有不同的标准,关于他们何时可能发生以便计入质量目的。

让我分解一下,希望能更好地解释一下。假设我们有3个代码,每个代码代表一种程序。

CODE    DESCRIPTION
--------------------
1234    Basic procedure
5678    Intermediate procedure
9012    Thorough procedure

现在,每种类型的程序都有自己的时间范围。基本版本必须在过去一年内执行才能计算。中间的一个可以是过去四个年的任何时间,而彻底的那个可以是十年年。因此,2014年接受中间程序的患者仍然需要用于质量目的,而且在2009年接受过彻底程序的患者仍然可以计算。

我有我的基本查询:

SELECT DISTINCT
    PatientID,
    PatientAge,
    ProcedureCode,
    CodeDescription,
    ServiceDate,
    RenderingProvider,
    VisitType

FROM ServiceDetail

WHERE ProcedureCode IN ('1234','5678','9012')

(是的,程序代码存储为varchars,因为实际数据库中的某些代码是字母数字)

现在,我希望能够使用IF / THEN / ELSE逻辑做一些事情,这可能是SQL中的CASE语句,除非我弄错了),可以查看代码的类型,服务日期是程序发生了,并确定该程序是否符合质量目的。

伪代码示例:

IF ProcedureCode = 5678
AND ServiceDate is between [GETDATE() minus 4 years] and GETDATE()
THEN Yes

对于其他两种程序类型及其各自的时间范围,会有相同的陈述。我希望查询只在这些情况返回true时显示结果。

我的问题是我知道我需要做什么但是我的SQL生锈了,我不确定如何这样做。基本上我正在寻找语法方面的技巧。

3 个答案:

答案 0 :(得分:1)

怎么样?
app.put('api/types/:_id', function(req,res){
    var id = req.params._id;
    var type = req.body;
    Type.updateType(id, type, {}, function(err, type){
        if(err){
            throw err;
        }
        res.json(type);
    });
});

答案 1 :(得分:1)

这适用于你的where子句

WHERE 
    ProcedureCode IN ('1234','5678','9012')
    AND VisitID IN
    (select VisitID 
    from ServiceDetail 
    where ServiceDate >=
        case 
        when ProcedureCode = 1234 then dateadd(year,-1,getdate())
        when ProcedureCode = 5678 then dateadd(year,-4,getdate())
        when ProcedureCode = 9012 then dateadd(year,-10,getdate())
        end)
    and ServiceDate <= getdate()

或者您可以为where子句的每个案例明确使用OR运算符。由于您明确要求,我给了CASE表达式。

如果您选择直接方法,则修复其他人的语法错误......

WHERE 
   (ProcedureCode = '1234' and ServiceDate Between DATEADD(year, -1, getdate()) and getdate()) 
OR
   (ProcedureCode = '5678' and ServiceDate Between DATEADD(year, -2, getdate()) and getdate())
etc...

答案 2 :(得分:1)

你真的不需要这样的案例,它只会使你的查询变得复杂。您可以像使用AND / OR一样简单地执行此操作

SELECT DISTINCT
    PatientID,
    PatientAge,
    ProcedureCode,
    CodeDescription,
    ServiceDate,
    RenderingProvider,
    VisitType

FROM ServiceDetail

WHERE (ProcedureCode  = '1234' and ServiceDate Between getdate() AND DATEADD(year, -1, getdate()) OR
(ProcedureCode  = '5678' and ServiceDate Between getdate() AND DATEADD(year, -2, getdate()) ...