我有一个公司表,其中包含第三方提供的唯一ID。该表在过去一年中变得非常大(超过100,000家公司),我们遇到了从提供的数据文件中导入其他公司的问题。
每个公司ID最多9个字符。问题是有时他们会添加前导零,有时他们不会。因此00321390与321390相同。
当我们去导入新数据集时,我们会寻找具有以下内容的现有公司:
WHERE TRIM(LEADING '0' FROM co_grp) = TRIM(LEADING '0' FROM import_grp)
公司表中的co_grp索引是唯一的。
临时导入表中的import_grp索引正常(导入文件中可能存在重复项,这些重复项在导入查询中的其他位置处理。
问题在于,在此步骤上运行此导入需要花费大量时间。我考虑添加一个列并复制,以便我们有一个列没有前导零,另一个列有两个前导零,但这听起来不是一个正确的方法来处理它。
最好的办法是什么?我不想进行批量更新并删除或添加前导零,因为访问此系统的公司喜欢前导零,因此他们知道它是来自导入的文件还是(没有前导零)来自其他来源。如果没有对后端进行大量其他更改,现在改变它太晚了。
答案 0 :(得分:1)
谢谢,它为我节省了很多时间。
我试图查看一个列,其中字符串列值在创建时向左填充了零,例如我要查找的 idclient 值是“21050”,并且在列值中保存为“00021050” ' 或 '021050' 等。
然后我的查询是:
select importe
from orders
where TRIM(LEADING '0' FROM idclient) like '21050';
如果您正在使用存储过程,那么您可能有一个名为 clienteIDParam 的参数
select importe
from orders
where TRIM(LEADING '0' FROM idclient) like clienteIDParam;
此查询返回 idclient 为“021050”或“0000021050”或“0021050”的值 在我的例子中,所有的行都是针对同一个客户端的,客户端代码为 21050。
答案 1 :(得分:0)
在MySql索引中从左到右工作。 因此,如果你从左边修剪任何东西,那么索引就不会有任何影响。
使用: -
WHERE co_grp like '0%' and import_grp like '0%' and TRIM(LEADING '0' FROM co_grp) = TRIM(LEADING '0' FROM import_grp)
这样您就可以过滤掉非前导零条目,您的查询将变得更有效率。