更新和插入筛选器

MERGE 语句中的每个 WHEN MATCHEDWHEN NOT MATCHED 子句都可以选择分别指定更新筛选器和插入筛选器:

WHEN MATCHED AND update-filter THEN UPDATE ...
WHEN NOT MATCHED AND insert-filter THEN INSERT ...

Vertica 还支持用于指定更新和插入筛选器的 Oracle 语法:

WHEN MATCHED THEN UPDATE SET column-updates WHERE update-filter
WHEN NOT MATCHED THEN INSERT column-values WHERE insert-filter

每个筛选器都可以指定多个条件。Vertica 按如下方式处理筛选器:

  • 更新筛选器应用于目标表中由 MERGE 联接返回的匹配行集。对于更新筛选器求值结果为 true 的每一行,Vertica 都会更新指定的列。

  • 插入筛选器应用于从 MERGE 联接中排除的源表行集。对于插入筛选器求值结果为 true 的每一行,Vertica 都会向目标表中添加一个具有指定值的新行。

例如,给定表 t11 t22 中的以下数据:


=> SELECT * from t11 ORDER BY pk;
 pk | col1 | col2 | SKIP_ME_FLAG
----+------+------+--------------
  1 |    2 |    3 | t
  2 |    3 |    4 | t
  3 |    4 |    5 | f
  4 |      |    6 | f
  5 |    6 |    7 | t
  6 |      |    8 | f
  7 |    8 |      | t
(7 rows)

=> SELECT * FROM t22 ORDER BY pk;
 pk | col1 | col2
----+------+------
  1 |    2 |    4
  2 |    4 |    8
  3 |    6 |
  4 |    8 |   16
(4 rows)

可以使用以下 MERGE 语句将表 t11 中的数据合并到表 t22 中,其中包括更新和插入筛选器:

=> MERGE INTO t22 USING t11 ON ( t11.pk=t22.pk )
   WHEN MATCHED
       AND t11.SKIP_ME_FLAG=FALSE AND (
         COALESCE (t22.col1<>t11.col1, (t22.col1 is null)<>(t11.col1 is null))
       )
   THEN UPDATE SET col1=t11.col1, col2=t11.col2
   WHEN NOT MATCHED
      AND t11.SKIP_ME_FLAG=FALSE
   THEN INSERT (pk, col1, col2) VALUES (t11.pk, t11.col1, t11.col2);
 OUTPUT
--------
      3
(1 row)

=> SELECT * FROM t22 ORDER BY pk;
 pk | col1 | col2
----+------+------
  1 |    2 |    4
  2 |    4 |    8
  3 |    4 |    5
  4 |      |    6
  6 |      |    8
(5 rows)

Vertica 按如下方式使用更新和插入筛选器:

  • 根据更新筛选器条件对所有匹配的行进行求值。Vertica 会更新以下两个条件的求值结果均为 true 的每一行:

    • 源列 t11.SKIP_ME_FLAG 设置为 false。

    • COALESCE 函数的求值结果为 true。

  • 根据插入筛选器,对源表中所有不匹配的行进行求值。对于列 t11.SKIP_ME_FLAG 设置为 false 的每一行,Vertica 都会在目标表中插入一个新行。