Как мы можем добавить NULL в качестве значения для поля в snowflake, которое принимает значение null, если его тип — datetime

#sql #timestamp #snowflake-cloud-data-platform #data-ingestion

#sql #временная метка #snowflake-cloud-data-platform #прием данных

Вопрос:

Я пытаюсь загрузить некоторые данные со сцены в таблицу, имеющую следующий 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:

 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' и '' , но получил ту же ошибку.

Комментарии:

1. Предположительно , ошибка находится в одном из других столбцов , которые фактически объявлены NOT NULL .

2. @GordonLinoff да, по-видимому, в CSV были нулевые значения, которые загружаются в NOT NULL объявленное поле, и это не связано с полем метки времени. Спасибо за комментарий.

Ответ №1:

Как говорится в сообщении об ошибке, вы пытаетесь вставить значение 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. Это не то, что может помочь вам избежать «НУЛЕВОГО результата в ненулевом столбце».

Комментарии:

1. Спасибо. Это было действительно полезно.