【问题标题】:db2 equivalent of MySql REPLACE INTOdb2 相当于 MySql REPLACE INTO
【发布时间】:2013-03-20 00:59:36
【问题描述】:

我喜欢 MySql 的非常有用的语句是REPLACE INTO table,即'REPLACE a value if-exist OR INSERT INTO table If-Not-Exist'。

db2 REPLACE 的文档是针对仅对字符串进行操作的函数,因此没有这个含义。

在 db2 中是否有任何等价物?现在我也在寻找关键字IF EXSTS/IF NOT EXIST

【问题讨论】:

    标签: mysql sql db2


    【解决方案1】:

    DB2 使用 SQL 标准 MERGE 语句来做基本相同的事情。语法不同:

    MERGE INTO table_to_upsert AS tab
    USING (VALUES
            (1, 2, 3),
            (4, 5, 6),
            (7, 8, 9)
            -- more rows
        ) AS merge (C1, C2, C3)
        ON tab.key_to_match = merge.key_to_match
        WHEN MATCHED THEN
            UPDATE SET tab.C1 = merge.C1,
                       tab.C2 = merge.C2,
                       tab.C3 = merge.C3
        WHEN NOT MATCHED THEN
            INSERT (C1, C2, C3)
            VALUES (merge.C1, merge.C2, merge.C3)
    

    【讨论】:

      【解决方案2】:

      您正在寻找的 DB2 函数是 MERGE

      CREATE TABLE FOO ( ID INT, TITLE VARCHAR(500), VALUE );
      CREATE TABLE BAR ( ID INT, TITLE VARCHAR(500), VALUE );
      INSERT INTO FOO VALUES (1, 'BAR', 5.0);
      INSERT INTO BAR VALUES (1, 'CCC', 3.0);
      INSERT INTO BAR VALUES (2, 'DDD', 1.0);
      
      MERGE INTO FOO AS F
         USING BAR AS B
         ON (F.ID = B.ID) WHEN MATCHED THEN UPDATE SET TITLE = B.TITLE, VALUE = F.VALUE - B.VALUE
         WHEN NOT MATCHED THEN INSERT VALUES(B.ID, B.TITLE, B.VALUE);
      
      SELECT ID, TITLE, VALUE FROM FOO;
      1    CCC    2.0
      2    DDD    1.0
      

      来自 DeveloperWorks 的 explanation 将填补一些空白。

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 2013-03-26
        • 1970-01-01
        • 2017-04-30
        • 2011-04-10
        • 1970-01-01
        • 2010-09-05
        • 2012-08-26
        相关资源
        最近更新 更多