【问题标题】:Compare Two Tables on Snowflake Where it Contains NULL Values比较 Snowflake 上包含 NULL 值的两个表
【发布时间】:2021-04-29 20:20:25
【问题描述】:

大家好,我面临一个问题,即 表 T1 与架构

ID TYPE MODEL_ID FREQ
1 Car 234 5
2 SUV 12 6
3 EV NULL NULL
4 HV NULL NULL

带有架构和数据的 TABLE T2

ID TYPE MODEL_ID FREQ
3 EV NULL NULL
4 HV NULL NULL

现在我正在检查以下查询的工作情况,

SELECT *  FROM T1 AS T, T2 AS N
  WHERE T.ID = N.ID AND T.TYPE = N.TYPE AND T.MODEL_ID = N.MODEL_ID AND T.FREQ = N.FREQ

结果是空集,我知道我需要实现一个空安全查询,但是对于这种情况我该如何实现呢。

注意:这里的ID不是标识符,所以应该与表中的每一列进行比较。

【问题讨论】:

  • 嗨@The_Third_Eye-请添加您的预期结果-因为您是要获取两个表中的内容还是其他内容?还有数据 - 你真的打算忽略电动汽车的型号 ID - 还是你现在刚刚得到不稳定的数据......
  • 很抱歉回复晚了,这是不可靠的数据。

标签: snowflake-cloud-data-platform querying


【解决方案1】:

您可以使用IS NOT DISTINCT FROM 执行 NULL 安全比较:

比较两个表达式是否相等(或不相等)。该函数是 NULL 安全的,这意味着它将 NULL 视为比较相等性的已知值。

SELECT *  
FROM T1 AS T, T2 AS N 
WHERE T.ID       IS NOT DISTINCT FROM N.ID 
  AND T.TYPE     IS NOT DISTINCT FROM N.TYPE 
  AND T.MODEL_ID IS NOT DISTINCT FROM N.MODEL_ID 
  AND T.FREQ     IS NOT DISTINCT FROM N.FREQ;

另一个更简单的选择是使用INTERSECT set 运算符:

SELECT * FROM t1
INTERSECT
SELECT * FROM T2;

db<>fiddle demo

【讨论】:

  • 第二种方法我已经使用了,但我需要第一种方法,因为我需要执行另一个操作,感谢@LukaszSzozda 的解决方案。
【解决方案2】:

另一种选择:

SELECT *  
FROM T1 AS T, T2 AS N 
WHERE EQUAL_NULL(T.ID,N.ID)
  AND EQUAL_NULL(T.TYPE,N.TYPE)
  AND EQUAL_NULL(T.MODEL_ID,N.MODEL_ID)
  AND EQUAL_NULL(T.FREQ,N.FREQ);

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多