如果雪花的类型为日期时间,我们如何将 NULL 添加为接受空值的雪花字段的值

问题描述

我正在尝试将某个阶段中的一些数据加载到具有以下 DDL 的表中:

CREATE TABLE IF NOT EXISTS SAT_COUNTRY_PROGRAMME (
  COUNTRY_PROGRAMME_SAT_HASH_KEY VARCHAR(32) NOT NULL,LOAD_DT DATETIME NOT NULL,LOAD_END_DT DATETIME NULL DEFAULT NULL,RECORD_SRC VARCHAR(64) NOT NULL,COUNTRY_NAME VARCHAR(64) NOT NULL,COUNTRY_PROGRAMME_HASH_KEY VARCHAR(32) NOT NULL,PRIMARY KEY (COUNTRY_PROGRAMME_SAT_HASH_KEY),CONSTRAINT fk_SAT_COUNTRY_PROGRAMME_HUB_COUNTRY_PROGRAMME1
    FOREIGN KEY (COUNTRY_PROGRAMME_HASH_KEY)
    REFERENCES HUB_COUNTRY_PROGRAMME (COUNTRY_PROGRAMME_HASH_KEY)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
;

如您所见,LOAD_END_DT 可能是 NULL

这是插入命令:

INSERT INTO SAT_COUNTRY_PROGRAMME
(SELECT md5(md5(t.$3)),current_timestamp(),NULL,'PORTFOLIO',(replace(replace(t.$4,t.$3),' - ')),md5(t.$3) 
FROM @INGEST_STAGE_TEMP/country_programmes.csv (file_format=>'GENERIC_CSV_FORMAT') t);

错误是:

NULL 导致不可为空的列

这里是文件格式:

ALTER FILE FORMAT "DEV_DB_IYCF"."DATA_VAULT_INGEST".GENERIC_CSV_FORMAT 
SET COMPRESSION = 'AUTO' FIELD_DELIMITER = ',' RECORD_DELIMITER = '\n' 
SKIP_HEADER = 1 FIELD_OPTIONALLY_ENCLOSED_BY = 'NONE' TRIM_SPACE = TRUE 
ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE ESCAPE = 'NONE' 
ESCAPE_UNENCLOSED_FIELD = '\134' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('NULL');

我尝试使用 'NULL''' 但遇到了同样的错误

解决方法

正如错误消息所说,您正在尝试将 NULL 值插入到不可为空的列中。因此,您需要检查前 4 列中是否有任何包含 NULL 值:

SELECT $1,$2,$3,$4 from @INGEST_STAGE_TEMP/country_programmes.csv 
(file_format=>'GENERIC_CSV_FORMAT')
where $1 is null or $2 is null or $3 is null or $4 is null ;

NULLIF 用于将诸如 'NULL' 之类的特定字符串转换为 NULL 值。这不能帮助您避免“不可为空的列中的 NULL 结果”。