代码之家  ›  专栏  ›  技术社区  ›  ATL-JP

将Null指定给CTE中的列

  •  0
  • ATL-JP  · 技术社区  · 2 年前

    我想分配一个 NULL 根据另一列是否 无效的 这两列都是之前CTE的结果,我似乎无法让它工作。

    这是我的代码:

    select 
        off_rent_start_date, 
        days_off_rent,
        case 
            when days_off_rent IS NULL
                then off_rent_start_date NULL
        end
    from 
        FinalData
    

    原始数据如下:

    off_rent_start_date 休息日
    2023-11-30 无效的

    预期结果应该如下:

    off_rent_start_date 休息日
    无效的 无效的
    2 回复  |  直到 2 年前
        1
  •  1
  •   d r    2 年前

    看起来你需要这样的东西:

    Select 
      Case When days_off_rent IS NULL  -- this is condition that could be True or False
           Then NULL                   -- When True return NULL
      Else off_rent_start_date         -- Else (False) return value from column off_rent_start_date
      End as off_rent_start_date,      -- this is column alias (label) for the resultset
      days_off_rent
    From FinalData
    

    CASE表达式从上到下按顺序工作。首先,当条件满足时,返回THEN值并退出CASE。如果它们都不满足,则从ELSE返回值,如果没有定义ELSE(这是可选的),则返回NULL。

    考虑到这一点,当days_off_rent不是NULL时,使用反向逻辑也可以得到相同的结果,否则取off_rent_start_date为NULL。

    Select 
      Case When days_off_rent IS NOT NULL 
           Then off_rent_start_date 
      End as off_rent_start_date,    -- there is no ELSE - so it results as NULL if WHEN condition is not satisfied
      days_off_rent
    From FinalData
    
        2
  •  0
  •   Armin    2 年前

    当days_off_rent为NULL时,您似乎试图将NULL分配给off_rent_start_date。但是,语法不正确。以下是更正后的代码:

     SELECT 
          off_rent_start_date, 
          days_off_rent,
          CASE 
            WHEN days_off_rent IS NULL 
            THEN NULL 
            ELSE off_rent_start_date 
          END AS off_rent_start_date_new
        FROM FinalData;
    

    在此更正版本中:

    我添加了一个ELSE子句,用于指定days_off_rent不为NULL时返回的值。 我已将CASE语句的结果分配给一个新的列别名off_rent_start_date_new,因为您不能直接为SELECT语句中的现有列分配值。 如果你想更新原始的off_rent_start_date列,你需要使用update语句:

    UPDATE FinalData
    SET off_rent_start_date = CASE 
      WHEN days_off_rent IS NULL 
      THEN NULL 
      ELSE off_rent_start_date 
    END;
    

    请注意,这将更新FinalData CTE或表中的原始数据。在将其应用于生产数据之前,请确保在开发环境中对此进行测试。