合并mysql表中的字符串而不需要额外的空格

2024-10-01 05:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在开发这个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    |                |
+-------------+---------------+------+-----+---------+----------------+

值从不为null,但许多(有时是绝大多数)是空字符串。你知道吗

我正在建立名称列。显而易见的方法是:

concat(namt,“”,namf,“”,naml,“”,nams)

但是当其中的2或3个是空的,这就给了我很多双空格和字符串开头或结尾的空格填充。你知道吗

我做过的事情:

1)使用python regex查找并删除多余的空格。如果我有一个月左右的时间来运行它,它就可以工作了。你知道吗

2)按上述方式将名称放在一起,并使用SQL查找和替换多余的空格。再说一次,要花很长时间。你知道吗

其中一个问题是MySQL的python库有一个游标,专门用来处理大的结果集。对于大型查询操作没有类似的情况。或许我看错了。你知道吗

% pip freeze
...
MySQL-python==1.2.5c
...

3)将名称拉入一个制表符分隔的文本文件并在那里进行修复,然后将文件加载到新表中。布莱奇。很多愚蠢的脚本。使用sed还是awk?什么?你知道吗

4)我可以在15个不同的查询中执行concat()操作,并为每个查询执行适当的concat,这样名称中就不会有多余的空格。我有:

  1. namt=null和namf=null和naml=null和nams!=空(案例0001)
  2. namt=null和namf=null和naml!=null和nams=null(案例0010)
  3. namt=null和namf=null和naml!=null和nams!=空(案例0011)
  4. 等等,等等

这就是我要的。跑步不到一天。呜呼!你知道吗

但我也出于其他原因做了类似的事情,我到底想写多少次这样的代码?哎呀!你知道吗

一定有更聪明的方法来做这件事,我没有看到。我在大约24个表中这样做,每个表中有2-5个名称,有时大约有15000行,有时有20000000行。大多数桌子在30万到75万之间。天哪,我累了吗。。。。你知道吗


Tags: no名称nullyesagent空格桌子varchar
1条回答
网友
1楼 · 发布于 2024-10-01 05:04:04

在MySQL中,我认为您正在寻找concat_ws()

concat_ws(' ', nullif(namt, ''), nullif(namf, ''), nullif(naml, ''), nullif(nams, ''))

如果值为空,nullif()将其转换为NULLconcat_ws()忽略NULL值,因此不会得到重复的空格。你知道吗

相关问题 更多 >