问题描述:数据库表中一个字段的数据为:
奥迪A1 2012款 1.4 TFSI Urban
奥迪A1 2012款 1.4 TFSI Ego
奥迪A1 2012款 1.4 TFSI Ego plus
奥迪A1 2013款 30 TFSI Sportback Urban
奥迪A1 2013款 30 TFSI Sportback Ego
奥迪A1 2013款 30 TFSI Sportback Ego plus
要求:将该类数据按第一个空格分割成两份,分别存放到表中的两个字段中。
第一种方法:使用正则表达式将字符串的第一个空格替换成‘\t’(制表符),然后通过sql命令导入数据库中。但是我在写正则表达式的时候不知道如何选择每行数据的第一空格,因为每行数据都有多个空格;后来的解决方法是先把数据导出来两份,第一份数据把第一个空格后面的数据删除,得到“奥迪A1”,然后再把另一份数据的第一个空格前面的数据删除,得到“2012款 1.4 TFSI Urban”,从而实现了一份数据的分割。
① 如何把第一个空格后面的数据删除?
使用Emeditor文本编辑器,在替换选项卡中查找框中输入【\s.*】,勾选使用正则表达式,然后点击替换全部按钮,即可将第一个空格后面的数据删除。
② 如何把第一个空格前面的数据删除?
这是最难的问题!使用Emeditor文本编辑器,在替换选项卡中查找框中输入【^(?:\S*?)(\s)】,勾选使用正则表达式,然后点击替换全部按钮,即可将第一个空格前面的数据删除。
经过以上两步,我们就得到了两份分割好的数据了,现在就可以把数据导入数据库中的表里去了,因为我们把数据分成两份不同的文件,但是需要导入到同一张表里的不同字段里,这里使用命令行写SQL语句,在表中导入导入单个字段的SQL语句为:
load data local infile '文件路径,如:D:\\id.txt' into table 表名 lines terminated by '\n' (字段名);
这个SQL语句有个问题,就是一个表中只能导入一次,将第一份数据导入后,那下一份数据导入的时候,就必须把表里面的数据清空。我们是两份数据,需要在同一张表里导入两个字段的数据,所以,这个导入单个字段数据的方法也不行。
Ø 这里补充一个知识点,如果我们不按上面的方法来做,而是把第一个空格替换成制表符,那么就不需要导入单个字段了,直接使用命令行导入表数据即可,SQL语句为:load data local infile '文件路径,如:D:\\data.txt' into table 表名 fields terminated by '\t'; 这个命令不存在以上的问题,可以直接导入。
接上面的问题,因为我们要的是将此类数据放入同一张表中的不同字段里,现在只能把这两份数据分别导入两张表里,然后使用多表查询,将查询出来的数据存放入一张新表里。
具体做法是:
1.在数据库里新建Car_Series表和Car_Type表,使用导入单个字段的SQL语句load data local infile '文件路径,如:D:\\id.txt' into table 表名 lines terminated by '\n' (字段名); 将“奥迪A1”导入到Car_Series表,将“2012款 1.4 TFSI Urban”导入到Car_Type表
2.值得一说的是:.txt或者Excel数据,都会默认在每一条后面加上一个回车符,导入到数据库后,就不能通过查询语句查询出来,这个时候,就需要把数据后面的回车符清除。清除的方法是:
SQL:update tableName set columnName = rtrim(ltrim(replace(columnName ,char(13),'')));
其他控制字符:制表符 char(9) | 换行符 char(10) | 回车符 char(13).
3.使用左连接查询出数据:select Series,Type from Car_Series left join Car_Type on Car_Series.CarID=Car_Type.CarID;
4.将查询出来的数据放入到新的表中:create table Car select Series,Type from Car_Series left join Car_Type on Car_Series.CarID=Car_Type.CarID; (这条语句会把数据放入到一个即时创建出来的新表中,如果想放入到一个已经创建好的表中,则使用:insert into Car select Series,Type from Car_Series left join Car_Type on Car_Series.CarID=Car_Type.CarID; )
附:这个功能最后实现的其实是三张表,但方法都是一样的,只是左连接的SQL语句不同而已。左连接三张表实例:select * from a left join b on a.id=b.id left join c on a.id=c.id