求助:如何用SQL*Loader将CSV空数据加载至TABLE_NULL表?
解决CSV NULL数据筛选导入TABLE_NULL的问题
我来帮你搞定这个空值筛选的问题~首先得搞清楚CSV里的"NULL数据"到底是什么形式——有时候是真正的空值,有时候是空字符串,甚至可能是写了'NULL'的字符串,不同情况对应不同的判断方式,下面给你几个可行的方案:
方案1:针对真正的空值(不是空格/字符串)
如果CSV里的NULL是原生的空值(不是填了空格或者'NULL'字符串),那直接用IS NULL判断就对了:
INSERT INTO TABLE_NULL SELECT * FROM your_csv_source WHERE <COLUMN_NAME> IS NULL;
要是你用的是类似Snowflake的COPY INTO这类加载语句,对应的WHEN条件应该写成:
COPY INTO TABLE_NULL FROM @your_stage/your_file.csv FILE_FORMAT = (TYPE = CSV) WHEN <COLUMN_NAME> IS NULL;
方案2:处理空字符串或空白字符
如果你的"NULL数据"其实是空字符串'',或者是一堆空格/不可见的空白字符,那可以用这两种方式判断:
- 精准匹配空字符串:
INSERT INTO TABLE_NULL SELECT * FROM your_csv_source WHERE <COLUMN_NAME> = '';
- 匹配所有空白(不管多少空格、制表符都能覆盖):
INSERT INTO TABLE_NULL SELECT * FROM your_csv_source WHERE TRIM(<COLUMN_NAME>) = '';
加载语句里的WHEN条件也可以这么写:
COPY INTO TABLE_NULL FROM @your_stage/your_file.csv FILE_FORMAT = (TYPE = CSV) WHEN TRIM(<COLUMN_NAME>) = '';
方案3:处理写了'NULL'的字符串
有些CSV会把空值存成字符串'NULL'(可能大写或小写),这时候就要匹配这个字符串:
INSERT INTO TABLE_NULL SELECT * FROM your_csv_source WHERE UPPER(<COLUMN_NAME>) = 'NULL';
要是想一步覆盖所有可能的空值场景,还可以把几个条件组合起来:
INSERT INTO TABLE_NULL SELECT * FROM your_csv_source WHERE <COLUMN_NAME> IS NULL OR TRIM(<COLUMN_NAME>) = '' OR UPPER(<COLUMN_NAME>) = 'NULL';
替代方案:先全量加载再拆分
要是上面的WHEN条件还是不好使,你可以换个思路:先把所有CSV数据加载到一个临时表,再拆分到两个目标表,这样更灵活:
- 先建临时表存全量数据:
CREATE TEMP TABLE TEMP_ALL_DATA AS SELECT * FROM your_csv_source;
- 把非空数据导入TABLE_NOT_NULL:
INSERT INTO TABLE_NOT_NULL SELECT * FROM TEMP_ALL_DATA WHERE <COLUMN_NAME> IS NOT NULL AND TRIM(<COLUMN_NAME>) != '' AND UPPER(<COLUMN_NAME>) != 'NULL';
- 把空/NULL数据导入TABLE_NULL:
INSERT INTO TABLE_NULL SELECT * FROM TEMP_ALL_DATA WHERE <COLUMN_NAME> IS NULL OR TRIM(<COLUMN_NAME>) = '' OR UPPER(<COLUMN_NAME>) = 'NULL';
这样不管CSV里的空值是什么形式,基本都能覆盖到啦~
内容的提问来源于stack exchange,提问作者Rahul Joshi
相关产品推荐
相关产品推荐

