Использовать CASE WHEN в той же команде SELECT?

Простой запрос Select x, y , z from Table содержит «Case when» в выборе.

Это поле заканчивается как «Конец как« поле результата »».

Я хотел бы использовать это «поле результата» в другой команде как часть той же команды SELECT (команда Dateadd).

SELECT
    PositionDate,
    ISIN,
    Issuer,
    FirstCouponDate,
    TermLength,
    TermUnit,
    CASE
       WHEN TermUnit = 'Years' THEN 'year'
       WHEN TermUnit = 'Months' THEN 'month'
    END AS 'TermUnitRenamed', 
    DATEADD(TermUnitRenamed, TermLength, FirstCouponDate),
FROM
    GIBDataWarehouse.dbo.vw_Positions

person tweedi    schedule 09.11.2018    source источник


Ответы (1)


Два предложения, основанные на предоставленной вами информации: добавьте значение по умолчанию ELSE к вашему оператору CASE; затем вложите этот запрос в последующий, чтобы вы могли ссылаться на новое созданное поле.

select
    *
    , case 
        when TermUnitRenamed = 'year' then DateAdd(year, TermLength, FirstCouponDate) 
        when TermUnitRenamed = 'month' then DateAdd(month, TermLength, FirstCouponDate) 
        when TermUnitRenamed = 'day' then DateAdd(day, TermLength, FirstCouponDate) 
        end as newDate
    from (
        select
            PositionDate
            , ISIN
            , Issuer
            , FirstCouponDate
            , TermLength
            , TermUnit
            , case
                when TermUnit = 'Years' then 'year'
                when TermUnit = 'Months' then 'month'
                else 'day' -- assumes default 'day' unit
                end AS TermUnitRenamed
        from GIBDataWarehouse.dbo.vw_Positions
) x

Конечно, вы можете просто применить логику CASE и DATEADD в самом исходном запросе и полностью избежать вложенности, если вам не нужен TermUnitRenamed для чего-либо еще.

select
    PositionDate
    , ISIN
    , Issuer
    , FirstCouponDate
    , TermLength
    , TermUnit
    , case
        when TermUnit = 'Years' then DateAdd(year, TermLength, FirstCouponDate) 
        when TermUnit = 'Months' then DateAdd(month, TermLength, FirstCouponDate) 
        else then DateAdd(day, TermLength, FirstCouponDate) -- assumes default 'day' unit
        end AS newDate
from GIBDataWarehouse.dbo.vw_Positions
person openwonk    schedule 09.11.2018