Snowflake - 插入后如何处理错误的虚拟列?

Snowflake - How do I handle a bad Virtual Column after it is INSERTed?

令我惊讶的是,我可以插入导致虚拟列变坏的行。那么如何检测错误的虚拟列并进行处理(尤其是在代码中)?

CREATE TABLE TEST
(
  REC_DATE          VARCHAR2(500),
  REC_TIME          VARCHAR2(500),
  REC_DATETIME      DATETIME AS TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS'  )
);

INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '02:22:22' );
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '03/03/2023', '03:33:33' );

然后插入导致错误虚拟列的错误行:

INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '99:22:22' );

SELECT * FROM TEST;

你应该得到这个错误:

"SQL 编译错误:错误行 1 在位置 7 无效标识符 'TEST'"

我想知道您将如何检测和清除坏行,尤其是在数据很多的情况下?

解决此问题的一种快速方法是对虚拟列使用安全定义。

第 1 步:删除虚拟列。

第 2 步:使用安全操作重新创建虚拟列 — 使用 TRY_TO_TIMESTAMP.

而不是 TO_TIMESTAMP
alter table test
drop column rec_datetime
;

alter table test
add column  REC_DATETIME    DATETIME AS try_TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS'  )
;

select * from test;

要识别坏行,您可以在应用之前的修复后查找空行:

select * from test 
where rec_date is not null 
and rec_datetime is null