如何通过SQL Loader控制文件丢弃含空值的CSV行?已尝试条件无效
解决SQL Loader导入CSV时丢弃含空值行的问题
我之前处理过好多次类似的SQL Loader空值过滤问题,你遇到的情况大概率是因为CSV里的“空值”形式和你写的判断条件不匹配,咱们一步步拆解解决:
先搞清楚CSV里的“空值”到底是什么样的
SQL Loader对不同形式的空内容处理逻辑不一样,先确认你的CSV里空值属于哪种:
- 完全空的字段:比如
1,,3这种两个逗号之间啥都没有 - 带空格的字段:比如
1, ,3中间是若干空格/制表符 - 带引号的空字符串:比如
1,"",3或者1," ",3
针对不同空值形式的解决方案
1. 处理完全空的字段或带引号的空字符串
如果你的CSV里是空字符串(包括""),SQL Loader默认会把这类内容解析成空字符串(不是NULL),所以你之前写的when String_Value is not null不会生效——因为它是''而不是NULL。
这时候可以两种方式处理:
方式一:在WHEN条件里直接判断非空字符串
把条件改成:WHEN String_Value <> ''但前提是你已经在控制文件里加了
OPTIONALLY ENCLOSED BY '"'(如果CSV用引号包裹字段的话),这样""会被正确解析为空字符串。方式二:先把空字符串转成NULL再判断
在字段定义里用NULLIF把空字符串转成NULL,然后用is not null判断:LOAD DATA INFILE 'your_data.csv' SKIP 1 -- 跳过表头 INTO TABLE your_target_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' WHEN String_Value IS NOT NULL ( ID INTEGER, String_Value CHAR(200) NULLIF(String_Value = '') -- 把空字符串转成NULL )
2. 处理带空格的“空”字段
如果CSV里的空值其实是一堆空格,那上面的条件就失效了——因为' '不等于'',也不是NULL。这时候必须用trim()函数去掉前后空白再判断:
WHEN trim(String_Value) <> ''
或者结合NULLIF:
WHEN trim(String_Value) IS NOT NULL
这个写法能同时处理空字符串、全空格、带引号的全空格这些情况。
额外要检查的控制文件细节
- 确保字段定义的长度足够:如果
String_Value定义的长度比实际内容短,可能会导致截断,意外产生空值或者不符合预期的内容。 - 确认
TRAILING NULLCOLS的使用:这个选项是让SQL Loader把行尾的空字段设为NULL,但不影响中间字段的判断,如果你需要的话可以加上,但不是必须的。
完整的控制文件示例
假设你的CSV是带表头、字段用逗号分隔、部分字段用引号包裹的格式,控制文件可以这么写:
LOAD DATA INFILE 'your_input.csv' SKIP 1 INTO TABLE your_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS WHEN trim(String_Value) <> '' -- 过滤所有空/全空格的行 ( ID INTEGER, String_Value CHAR(200) NULLIF(trim(String_Value) = '') -- 把空/全空格转成NULL )
这样就能确保所有String_Value为空、全空格、带引号空字符串的行都被丢弃,不会导入数据库。
内容的提问来源于stack exchange,提问作者Saurabh Mehta
相关产品推荐
相关产品推荐

