我从互联网上下载了一个数据集,但格式不正确。邮政编码破坏了我的网站。一些是完整的9个整数代码,另一些是2或3个整数,因为前导零没有正确格式化,并且介于两者之间。我需要正常的5位邮政编码才能使我的网站正常工作。数据集也超过200万行,因此很难在Excel中工作。我希望它能在MySQL中工作。
我已经用VBA编写了代码,并在Excel中对部分数据进行了测试,并得到了预期的结果。
Function fixZips()
Dim cel As Range
For Each cel In Application.Selection
If Len(cel.Value) = 4 Then
cel.Value = "0" & cel.Value
ElseIf Len(cel.Value) = 3 Then
cel.Value = "00" & cel.Value
ElseIf Len(cel.Value) = 2 Then
cel.Value = "000" & cel.Value
ElseIf Len(cel.Value) = 7 Then
cel.Value = "00" & Left(cel.Value, Len(cel.Value) - 4)
ElseIf Len(cel.Value) = 8 Then
cel.Value = "0" & Left(cel.Value, Len(cel.Value) - 4)
ElseIf Len(cel.Value) = 9 Then
cel.Value = Left(cel.Value, Len(cel.Value) - 4)
End If
Next cel
End Function
我很难确定如何在MySQL中执行此操作。我正在使用phpMyAdmin。我可以在“ SQL”框中执行所有操作吗?我需要创建一个存储过程吗?如果是这样,我该如何在phpMyAdmin中做到这一点?
答案 0 :(得分:4)
对于SQL查询,您可以使用substr和lpad
select lpad(substr(your_column, 1,5), 5, '0')
from your_table
答案 1 :(得分:2)
仅使用纯SQL,让MySQL引擎处理所需的结果,而不处理Excel应用程序。下面是冗长的版本,以显示Excel VBA如何转换为SQL。另外,使用CASE
和双管道是ANSI标准,并且适用于大多数SQL方言。
选择SQL
SET sql_mode='PIPES_AS_CONCAT';
SELECT bad_zip, LENGTH(bad_zip),
CASE LENGTH(bad_zip)
WHEN 2 THEN '000' || bad_zip
WHEN 3 THEN '00' || bad_zip
WHEN 4 THEN '0' || bad_zip
WHEN 7 THEN '00' || LEFT(bad_zip, LENGTH(bad_zip) - 4)
WHEN 8 THEN '0' || LEFT(bad_zip, LENGTH(bad_zip) - 4)
WHEN 9 THEN LEFT(bad_zip, LENGTH(bad_zip) - 4)
ELSE bad_zip
END As clean_zip
FROM myTable;
更新SQL
SET sql_mode='PIPES_AS_CONCAT';
UPDATE myTable
SET final_zip = CASE LENGTH(bad_zip)
WHEN 2 THEN '000' || bad_zip
WHEN 3 THEN '00' || bad_zip
WHEN 4 THEN '0' || bad_zip
WHEN 7 THEN '00' || LEFT(bad_zip, LENGTH(bad_zip) - 4)
WHEN 8 THEN '0' || LEFT(bad_zip, LENGTH(bad_zip) - 4)
WHEN 9 THEN LEFT(bad_zip, LENGTH(bad_zip) - 4)
ELSE bad_zip
END;