我一直在开发django应用程序。我们从加利福尼亚州立机构中提取了一大组表格,对数据进行处理并重新发布。我一直在尝试做一些简单的事情,但是简单的实现真的很慢,我可能会把自己想成一个洞。这是其中一张桌子的一点。有很多这样的桌子。
mysql> desc EXPN_CD;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| AGENT_NAMF | varchar(45) | NO | | NULL | |
| AGENT_NAML | varchar(200) | NO | | NULL | |
| AGENT_NAMS | varchar(10) | NO | | NULL | |
| AGENT_NAMT | varchar(10) | NO | | NULL | |
| AMEND_ID | int(11) | NO | MUL | NULL | |
| AMOUNT | decimal(14,2) | NO | | NULL | |
| BAKREF_TID | varchar(20) | NO | | NULL | |
| BAL_JURIS | varchar(40) | NO | | NULL | |
| BAL_NAME | varchar(200) | NO | | NULL | |
| BAL_NUM | varchar(7) | NO | | NULL | |
| CAND_NAMF | varchar(45) | NO | | NULL | |
| CAND_NAML | varchar(200) | NO | | NULL | |
| CAND_NAMS | varchar(10) | NO | | NULL | |
| CAND_NAMT | varchar(10) | NO | | NULL | |
| CMTE_ID | varchar(9) | NO | | NULL | |
| CUM_OTH | decimal(14,2) | YES | | NULL | |
| CUM_YTD | decimal(14,2) | YES | | NULL | |
| DIST_NO | varchar(3) | NO | | NULL | |
| ENTITY_CD | varchar(3) | NO | | NULL | |
| EXPN_CHKNO | varchar(20) | NO | | NULL | |
| EXPN_CODE | varchar(3) | NO | | NULL | |
| EXPN_DATE | date | YES | | NULL | |
| EXPN_DSCR | varchar(400) | NO | | NULL | |
| FILING_ID | int(11) | NO | MUL | NULL | |
...我正在看所有这些桌子。我取出每个名字,"CAND“(候选人),"AGENT”等等,并将每一个引用放入一行:
mysql> desc calaccess_campaign_browser_name;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ext_pk | int(11) | NO | MUL | NULL | |
| ext_table | varchar(255) | NO | | NULL | |
| ext_prefix | varchar(255) | NO | | NULL | |
| naml | varchar(255) | YES | | NULL | |
| namf | varchar(255) | YES | | NULL | |
| nams | varchar(255) | YES | | NULL | |
| namt | varchar(255) | YES | | NULL | |
| name | varchar(1023) | YES | | NULL | |
+-------------+---------------+------+-----+---------+----------------+这些值从来都不是空值,但很多(有时是绝大多数)都是空字符串。
我正在建立名字列。最明显的方法是:
(namt,‘',namf,’',naml,‘',nams)
但是当其中的2或3是空白的时候,这就给了我大量的双空格和空格填充在字符串的开头或结尾。
我做过的事:
1)使用python查找并删除额外的空格。如果我有一个月左右的时间让它运行的话,这是可行的。
2)将上述名称放在一起,并使用SQL查找和替换额外的空格。再说一次,需要很长时间。
其中一个问题是,python的MySQL库有一个游标,特别是用于处理大型结果集的游标。对于大型查询操作,没有类似之处。或者我看错了。
% pip freeze
...
MySQL-python==1.2.5c
...3)将名称提取到一个由选项卡分隔的文本文件中,并在其中进行修复,然后将该文件加载到新表中。布莱。很多愚蠢的脚本。用sed还是awk?什么?
4)我可以在15个不同的查询中执行concat()操作,并为每个查询执行适当的concat操作,以便在名称中没有额外的空格。我有:
实际上这就是我要去的地方。跑不了一天。哇哦!
但是,出于其他原因,我也在做类似的事情,我是如何多次想要编写这样的代码的呢?利克!
一定有一种更聪明的方法来做这件事,而我并没有看到。我在大约20多个表中这样做,每个表中有2-5个名称,有时大约有15,000行,有时有20,000,000行。大多数表在300 000至750 000之间。天哪,我累了吗.
发布于 2015-05-20 20:16:56
在MySQL中,我认为你在寻找concat_ws()
concat_ws(' ', nullif(namt, ''), nullif(namf, ''), nullif(naml, ''), nullif(nams, ''))如果值为空,则nullif()将该值转换为NULL。concat_ws()忽略NULL值,因此不会得到重复的空格。
https://stackoverflow.com/questions/30359495
复制相似问题