将代码从VBA转换为SQL(固定邮政编码)

时间:2018-08-15 15:34:40

标签: mysql sql vba

我从互联网上下载了一个数据集,但格式不正确。邮政编码破坏了我的网站。一些是完整的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中做到这一点?

2 个答案:

答案 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;

RexTester Demo

相关问题