我有一个文件,可以包含3到4列以逗号分隔的数值。当空字段位于行尾时,则定义为空字段:
1,2,3,4,5
1,2,3,,5
1,2,3
下表是在MySQL中创建的:
+ ------- + -------- + ------ + ----- + --------- + ------- + | 领域| 类型| 空| 关键 默认值| 额外| + ------- + -------- + ------ + ----- + --------- + ------- + | 一| int(1)| 是的 | NULL | | | 二| int(1)| 是的 | NULL | | | 三| int(1)| 是的 | NULL | | | 四| int(1)| 是的 | NULL | | | 五| int(1)| 是的 | NULL | | + ------- + -------- + ------ + ----- + --------- + ------- +
我正在尝试使用MySQL LOAD命令加载数据:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
结果表:
+ ------ + ------ + ------- + ------ + ------ + | 一| 二| 三| 四| 五| + ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
问题在于,当原始数据中的字段为空且未定义时,MySQL由于某种原因不使用列默认值(为NULL),而是使用零。当该字段一起丢失时,可以正确使用NULL。
不幸的是,在这一阶段,我必须能够区分NULL和0,因此将不胜感激。
谢谢S。
编辑
SHOW WARNINGS的输出:
+ --------- + ------ + -------------------------------- ------------------------ + | 级别| 验证码| 留言| + --------- + ------ + -------------------------------- ------------------------ + | 警告| 1366 | 错误的整数值:“”对于第2行的“四”列| | 警告| 1261 | 第3行未包含所有列的数据| | 警告| 1261 | 第3行未包含所有列的数据| + --------- + ------ + -------------------------------- ------------------------ +
这将做你想要的。它将第四个字段读入局部变量,然后如果该局部变量最终包含一个空字符串,则将实际字段值设置为NULL:
LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;
如果它们都可能为空,则将它们全部读入变量并具有多个SET语句,如下所示:
LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;
从理论上讲,我想-但它们全都在内存中,并且每行只保存少量数据,因此我想将其成像为无穷小。但是如果您认为这可能是一个问题,则应该对其进行测试。
我真的很喜欢这个答案。
''
当用户下载excel的csv(IFNULL(Col,'')
在SELECT INTO OUTFILE
查询中使用),然后上传后,用户可以看到空字符串,而将其接受为null则不必\N
在csv中进行处理。谢谢!对于我使用的日期'NULLIF(STR_TO_DATE(@ date1,“%d /%m /%Y”),“ 0000-00-00”)'
我有一个csv文件,其中包含
0
应该转换为零的零NULL
(因为所讨论的数据不可能为零)以及空字符串。如何确保零和空字符串都转换为NULL
?如果零值和空字符串在不同的列中,则只需对空字符串执行上述操作,并对零进行以下操作:
nullif(@vone, 0)
。