2016-12-07 163 views
0

的计算列在我的SELECT声明中,CusLifeTime的值是这样计算的。基于另一列值CASE

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, 

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

我该如何做到这一点?

+1

您将无法在同一个选择使用它,但你可以在CTE或派生表包裹'select'然后用'CusLifeTime'在另一列 – ughai

+0

一种替代方法是使用子查询。 – Susang

+0

你可以做一个存储功能,只提供所需的参数 – Jester

回答

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()的奇怪构造。前者更清晰和标准,并允许使用索引。
+0

Re'ISULL',它是否也适用于空字符串? – Disasterkid

+0

Re'DATEDIFF()'你推荐什么来计算两个日期之间的差异? – Disasterkid

+0

@Disasterkid。 。 。 “IS NULL”不适用于空字符串,但根据列的使用情况,它看起来是日期/日期时间。这样的列不能被“空”而不是“NULL”。至于'DATEDIFF()',你应该确定它正在做你真正想要的。 –

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