使用IF / ELSE逻辑在SQL查询中创建新列?

时间:2019-12-17 18:54:54

标签: sql sql-server case

我正在处理一个查询,该查询会提取访问某个位置的人员的列表。该位置的部分政策是,如果某人在3年内没有来过,那么他们将不再是活跃成员,而必须重新建立其成员身份。通常,我只是将查询结果粘贴到Excel中,并添加一个带有公式的列,该公式可以查看上次访问日期并标记此人是否活跃,但是我想我可以尝试将计算结果直接添加到查询中并使用SQL服务器为我完成工作。问题是,我不确定语法。

我希望最终结果看起来像这样(通常,我的Excel公式距创建报告的日期只有3年了,因此,对于本示例而言,我们将查找3从2019年12月17日算起):

PersonID    LastVisit     Active
-------------------------------------
1001        2019-12-01    YES
1002        2014-07-24   
1003        2016-12-31    YES
1004        2018-10-12    YES
1005        2016-02-04
1006        2017-09-20    YES

如果到目前为止我已经尝试做的一些研究对我的理解是正确的,则需要使用CASE声明。

SELECT
   PersonID,
   LastVisit,
   CASE [--not sure what, if anything, goes here--]
      WHEN LastVisit > DATEADD(yy,-3,GETDATE()) THEN 'YES'
      END AS Active

FROM PersonInfo
ORDER BY PersonID

就目前而言,我遇到了两个语法错误:incorrect syntax near '>'incorrect syntax near 'THEN'。我至少在正确的轨道上吗?我需要做些什么才能使这种逻辑起作用?

2 个答案:

答案 0 :(得分:4)

此语法应该起作用:

(CASE WHEN LastVisit > DATEADD(year, -3, GETDATE()) THEN 'YES'
 END) AS Active

顺便说一下,这在SQL中称为case 表达式

答案 1 :(得分:2)

我在您的代码中看到的唯一实际问题是方括号。您可以在case语句中的第一个方括号之后开始注释。如果您删除了不必要的内容或提早开始评论,那么它应该可以工作。

完全删除评论:

SELECT
   PersonID,
   LastVisit,
   CASE 
      WHEN LastVisit > DATEADD(yy,-3,GETDATE()) THEN 'YES'
      END AS Active

FROM PersonInfo
ORDER BY PersonID

或者只是更早地发表评论

SELECT
   PersonID,
   LastVisit,
   CASE --[not sure what, if anything, goes here--]
      WHEN LastVisit > DATEADD(yy,-3,GETDATE()) THEN 'YES'
      END AS Active

FROM PersonInfo
ORDER BY PersonID