2016-12-07 6 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, 

Теперь я хотел бы использовать значение CusLifeTime в другой колонке (опять же с помощью CASE) в том же SELECT заявлении.

Как я могу это достичь?

+1

вы не сможете использовать его в том же выбрать, но вы можете обернуть '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) 

Колонку можно затем использовать в выражениях.

Примечание:

  • Я рекомендую вам использовать имена части полной даты для функций, которые принимают их. Это понятно для людей, читающих код, и устраняет двусмысленность в отношении того, означает ли «мм» месяцы или минуты.
  • Вы действительно знаете, что такое DATEDIFF()? Вы можете быть удивлены. Прочтите документацию. Он возвращает количество границ раздела даты между двумя значениями.
  • Просто укажите IS NULL, а не странную конструкцию, используя ISNULL(). Первый является более четким и стандартным и позволяет использовать индексы.
+0

Re 'IS NULL', применим ли он к пустым строкам? – 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 
Смежные вопросы