在我的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
的值。
我怎样才能做到这一点?
答案 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)
然后可以在表达式中使用该列。
注意:
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