Snowflake 忽略我比较时间戳的 where 子句中的语句

问题描述 投票:0回答:2

所以我正在雪花中构建SCD类型2,但它忽略了其中比较“to_timestamp”和“expiry_date”的where子句。 Expiry_date 是一个设置为“9999-08-17 07:31:29.901000000”(无穷大)的变量,To_timestamp 是表中的一列。我只想查询 to_timestamp 设置为无穷大的行(它们仍然处于活动状态),但雪花似乎忽略了 where 子句的这一部分。下面是一些代码(它应该更新过期的行 - 这意味着将它们的“to_timestamp”更改为当前时间。它确实如此,但它对具有各种时间戳的行执行 - 它忽略最后一行)

SET EXPIRY_DATE_NTZ = '9999-08-17 07:31:29.901000000';
SET CURRENT_DATE_NTZ = TO_TIMESTAMP_NTZ(CURRENT_TIMESTAMP());


UPDATE CUSTOMER_TARGET CT
SET CT.TO_TIMESTAMP = $CURRENT_DATE_NTZ
FROM POC.SNOWFLAKE_POC.CUSTOMER_STAGE CS
WHERE CT.C_CUSTOMER_ID = CS.C_CUSTOMER_ID
    AND (CT.C_FIRST_NAME <> CS.C_FIRST_NAME OR CT.C_LAST_NAME <> CS.C_LAST_NAME OR CT.C_BIRTH_YEAR 
    <> CS.C_BIRTH_YEAR OR CT.C_BIRTH_COUNTRY <> CS.C_BIRTH_COUNTRY OR CT.C_LAST_REVIEW_DATE<>CS.C_LAST_REVIEW_DATE)
    AND CT.TO_TIMESTAMP = $EXPIRY_DATE_NTZ;

我有两个更新语句(一个用于更新,一个用于删除)和一个用于插入的合并语句。它忽略每一个的比较,将“to_timestamp”设置为“2021-08-24 07:11:53.510000000”之类的行更新。我已经尝试了所有可能的组合(在...和...之间,>= ... <=, <=, >=,在更新的“case”语句中进行比较,...) - 什么也没有。可能是什么原因/解决方案?

sql timestamp snowflake-cloud-data-platform compare equality
2个回答
1
投票

您的 SQL 过滤器没有任何问题(OR 被括号等包围)。我假设您已检查执行配置文件,但没有看到过滤器 (CT.TO_TIMESTAMP = '9999-08-17 07:31:29.901000000')。在这种情况下,目标表中的所有行都应在 TO_TIMESTAMP 列中具有此值。

我强烈建议您先检查数据。如果您正在运行多个 UPDATE/MERGE 命令,您可能会错过数据已使用此值更新的情况。


0
投票

由于我们不知道

CUSTOMER_TARGET
的结构,我建议显式设置
EXPIRY_DATE_NTZ
变量的数据类型以匹配列数据类型:

SET EXPIRY_DATE_NTZ = '9999-08-17 07:31:29.901000000';
SELECT $EXPIRY_DATE_NTZ;
DESCRIBE RESULT LAST_QUERY_ID();

至:

-- TIMESTAMP_NTZ as an example
SET EXPIRY_DATE_NTZ = '9999-08-17 07:31:29.901000000'::TIMESTAMP_NTZ;  
SELECT $EXPIRY_DATE_NTZ;
DESCRIBE RESULT LAST_QUERY_ID();

通过这种方式,该过程中不涉及“隐式转换”。


另一个建议是使用

IS DISTINCT FROM
而不是
<>
IS DISTINCT FROM
是 NULL 安全的,如果列定义为可空,这一点很重要。

UPDATE CUSTOMER_TARGET CT
SET CT.TO_TIMESTAMP = $CURRENT_DATE_NTZ
FROM POC.SNOWFLAKE_POC.CUSTOMER_STAGE CS
WHERE CT.C_CUSTOMER_ID = CS.C_CUSTOMER_ID
    AND (CT.C_FIRST_NAME IS DISTINCT FROM CS.C_FIRST_NAME 
         OR CT.C_LAST_NAME IS DISTINCT FROM CS.C_LAST_NAME 
         OR CT.C_BIRTH_YEAR IS DISTINCT FROM CS.C_BIRTH_YEAR 
         OR CT.C_BIRTH_COUNTRY IS DISTINCT FROM CS.C_BIRTH_COUNTRY 
         OR CT.C_LAST_REVIEW_DATE IS DISTINCT FROM CS.C_LAST_REVIEW_DATE)
    AND CT.TO_TIMESTAMP = $EXPIRY_DATE_NTZ;
© www.soinside.com 2019 - 2024. All rights reserved.