代码之家  ›  专栏  ›  技术社区  ›  Rexam

是否可以在集合中包含if语句?

  •  0
  • Rexam  · 技术社区  · 8 年前

    我在Oracle中有一个表,列名为 ERROR_CODE (这是一个 VARCHAR2 )最初设置为 NULL 每一个价值。我想用 UPDATE 如下语句中的语句:

    UPDATE SNAPSHOT_TEST
    SET ERROR_CODE = 
      IF(...) THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '9')
        ELIF(...) THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9') 
        ELIF(...) ...
      END IF;
    

    我试着用 CASE 语句来实现这个结果,它是有效的,但这不是我所需要的,因为多个条件可以同时匹配,如果发生这种情况,我需要像在前面插入的语句中那样连接错误代码,例如,结尾有“8,9”。 在Oracle中有实现这一点的方法吗?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Lukasz Szozda    8 年前

    CASE

    UPDATE SNAPSHOT_TEST
    SET ERROR_CODE = 
        CASE  WHEN ... THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '9')
              WHEN ... THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9') 
              ELSE ...
        END;
    

    UPDATE SNAPSHOT_TEST
    SET ERROR_CODE =
      ERROR_CODE || CASE WHEN ... THEN '8' END || CASE WHEN ... THEN '9' END
    
        2
  •  1
  •   wolφi    8 年前

    LISTAGG

        3
  •  1
  •   Alex Poole    8 年前

    update snapshot_test
    set error_code = 
      ltrim(
        case when (...) then ',8' end
        || case when (...) then ',9' end
        || case when (...) then ',10' end
        ...
        , ',');
    

    ltrim

    db<>fiddle demo

        4
  •  0
  •   Rexam    8 年前

    UPDATE

    UPDATE SNAPSHOT_TEST
    SET ERROR_CODE = NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '8')
    WHERE (...);
    
    UPDATE SNAPSHOT_TEST
    SET ERROR_CODE = NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9')
    WHERE (...);
    

    ERROR_CODE NULL