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