【问题标题】:Convert code from VBA to SQL (fixing zip codes)将代码从 VBA 转换为 SQL(修复邮政编码)
【发布时间】:2019-01-22 12:25:14
【问题描述】:

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

【问题讨论】:

  • 我建议查看 case/when/else。它会又大又丑,但它几乎就是你已经拥有的,只是在 sql 中:)
  • 您获得的数据集是 Excel 文件还是 CSV?如果是后者,请不要在 Excel 中打开它。
  • 在 VBA 中你也不会那样做 :) 如果你处理的是长度为 1000 而不是 5 的代码怎么办?

标签: mysql sql vba


【解决方案1】:

对于 sql 查询,您可以使用 substr 和 lpad

 select lpad(substr(your_column, 1,5), 5, '0') 
 from your_table 

【讨论】:

    【解决方案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

    【讨论】:

    • 是的。 完全跳过 Excel。关于“也超过 200 万行”这一点很好地暗示了 OP 的文件一开始就不是 Excel 文件......
    • 确实@Comintern ...数据可以在多张纸上!我在 Excel 中看到过疯狂的事情,忘记了它不是数据库。
    • 这段代码完美运行!太感谢了!拉我的头发好几个小时了。
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2021-01-09
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多