2016-12-07 201 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