根据具有CASE的另一列的值计算列

时间:2016-12-07 11:39:09

标签: sql sql-server tsql

在我的SELECT声明中,CusLifeTime的值是这样计算的。

CASE 
   WHEN ISNULL(c.cus_DateStop, '') = '' THEN DATEDIFF(yy,cus_DateStart , GETDATE())
   WHEN DATEDIFF(yy,cus_DateStart , cus_DateStop) < 0 THEN -1
   ELSE DATEDIFF(yy,cus_DateStart , cus_DateStop)
END AS CusLifeTime,

现在,我想在同一CusLifeTime语句中使用另一列{再次使用CASE)中SELECT的值。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

两种“正常”方式是使用CTE或子查询。 SQL Server还允许您使用apply,这很方便,因为它限制了查询深度:

SELECT . . .,
       v.CusLifeTime
FROM . . . OUTER APPLY
     (VALUES (CASE WHEN c.cus_DateStop IS NULL THEN DATEDIFF(year, cus_DateStart, GETDATE())
                   WHEN DATEDIFF(YEAR, cus_DateStart, cus_DateStop) < 0 THEN -1
                   ELSE DATEDIFF(YEAR, cus_DateStart, cus_DateStop)
              END)
     ) AS v(CusLifeTime)

然后可以在表达式中使用该列。

注意:

  • 我建议您使用完整日期部件名称来获取它们的功能。对于阅读代码的人来说,这一点更加清晰,并消除了“mm”是否意味着数月或分钟的含糊不清。
  • 你真的知道DATEDIFF()的作用吗?你可能会感到惊讶。阅读文档。它返回两个值之间的日期部分边界数。
  • 使用IS NULL明确说明ISNULL()而不是奇怪的构造。前者更清晰,更标准,允许使用索引。

答案 1 :(得分:0)

您可以使用如下:

SELECT CusLifeTime,  
CASE WHEN CusLifeTime = 0 THEN 
    'SomeValue' 
ELSE 'AnotherValue' END AS ComputedCusLifeTime
FROM (
SELECT
    CASE 
       WHEN ISNULL(c.cus_DateStop, '') = '' THEN DATEDIFF(yy,cus_DateStart , GETDATE())
       WHEN DATEDIFF(yy,cus_DateStart , cus_DateStop) < 0 THEN -1
       ELSE DATEDIFF(yy,cus_DateStart , cus_DateStop)
    END AS CusLifeTime
FROM myTable) t