我一直在研究这个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" (候选人),"代理"等等,并将每个参考文献放入一行:
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 | |
+-------------+---------------+------+-----+---------+----------------+
值永远不会为null,但许多(有时绝大多数)都是空字符串。
我正在构建名称列。显而易见的方法是:
concat(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,以便我在名称中没有多余的空格。我有:
这实际上就是我的用途。运行不到一天。哇噢!
但是我也是出于其他原因做了类似的事情,我多次想要编写这种代码?伊克!
我必须有一种更聪明的方式来做到这一点,我没有看到。我在大约24个表中执行此操作,每个表中有2 - 5个名称,有时大约15,000行,有时20,000,000行。大多数餐桌的价格在300,000到750,000之间。而且,jeez,我累了....
答案 0 :(得分:1)
在MySQL中,我认为您正在寻找concat_ws()
:
concat_ws(' ', nullif(namt, ''), nullif(namf, ''), nullif(naml, ''), nullif(nams, ''))
nullif()
如果为空,则将值转为NULL
。 concat_ws()
会忽略NULL
个值,因此您不会获得重复的空格。