使用具有空值的列从 table 中删除 Snowflake

Delete from table using columns with null values Snowflake

我有一个自动过程,可以根据 table 定义的主键进行增量插入。几table秒后,主键出现空值,根本无法从根本上解决,只好处理

获得table的主键后,我们运行查询删除记录如下:

DELETE FROM table
USING stg_table
WHERE table.pk_1 = stg_table.pk_1 AND table.pk_2 = stg_table.pk_2

这有效,除非 pk_1pk_2 中的某些值为空。我已完成以下操作来解决它:

DELETE FROM table
USING stg_table
WHERE NVL(table.pk_1, 'null') = NVL(stg_table.pk_1, 'null')

然而,这仅在 pk_1VARCHAR 时有效,否则将失败。

我可以修改我的自动化脚本并获取每列的类型,并根据它向 NVL 函数传递不同的值,但我想知道是否有任何方法可以仅使用 Snowflake 正确实现删除。

如果你想NULL值匹配,你可以使用:

DELETE FROM table
USING stg_table
WHERE (table.pk_1 = stg_table.pk_1 OR table.pk_1 IS NULL AND stg_table.pk_1 IS NULL) AND
      (table.pk_2 = stg_table.pk_2 OR table.pk_2 IS NULL AND stg_table.pk_2 IS NULL)

或者,使用 EQUAL_NULL(),Snowflake 的 NULL 安全比较运算符:

DELETE FROM table
USING stg_table
WHERE EQUAL_NULL(table.pk_1, stg_table.pk_1) AND
      EQUAL_NULL(table.pk_2, stg_table.pk_2);

综上所述,根据 SQL 的定义,主键 永远不会 NULL。而且,创建两个不同表中的 NULL 值应该匹配的数据库确实很少见。

IS DISTINCT FROM 是 null 安全运算符,它允许比较元组:

DELETE FROM table
USING stg_table
WHERE (table.pk_1,table.pk_2) IS NOT DISTINCT FROM (stg_table.pk_1, stg_table.pk_2);