基于另一列值CASE
的计算列在我的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
)。
我该如何做到这一点?
这两个“正常”的方式正在使用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()
的奇怪构造。前者更清晰和标准,并允许使用索引。
Re'ISULL',它是否也适用于空字符串? – Disasterkid
Re'DATEDIFF()'你推荐什么来计算两个日期之间的差异? – Disasterkid
@Disasterkid。 。 。 “IS NULL”不适用于空字符串,但根据列的使用情况,它看起来是日期/日期时间。这样的列不能被“空”而不是“NULL”。至于'DATEDIFF()',你应该确定它正在做你真正想要的。 –
您可以如下使用:
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
您将无法在同一个选择使用它,但你可以在CTE或派生表包裹'select'然后用'CusLifeTime'在另一列 – ughai
一种替代方法是使用子查询。 – Susang
你可以做一个存储功能,只提供所需的参数 – Jester