在同一个 SELECT 命令中使用 CASE WHEN?

Use a CASE WHEN in the same SELECT command?

来自 Table 查询的简单 Select x, y , z 在 select.

中包含一个 "Case when"

此字段的结尾为 "End as 'result field'"。

我想在另一个命令中使用 'result field' 作为同一 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

根据您提供的信息提出两个建议:在您的 CASE 语句中添加一个 ELSE 默认值;然后,将此查询嵌套在后续查询中,以便您可以引用新创建的字段。

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

当然,您可以只在原始查询本身中应用 CASEDATEADD 逻辑,如果您不需要 [,则完全避免嵌套 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