Конвертировать код из VBA в SQL (исправление почтовых индексов)

0

Я загрузил набор данных из Интернета, и он был плохо форматирован. Почтовые индексы ломают мой сайт. Некоторые из них представляют собой полные 9 целых кодов, другие - 2 или 3 целых числа, потому что ведущие нули не были отформатированы правильно и все между ними. Мне нужен нормальный 5-значный почтовый индекс для работы моего сайта. Набор данных также превышает 2 миллиона строк, поэтому трудно работать в 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
    Я рекомендую смотреть на случай / когда / еще. Это будет большой и уродливый, но это будет в значительной степени то, что у вас уже есть, просто в SQL :)
  • 2
    Вы получили набор данных в виде файла Excel или CSV? Если это позже, просто не открывайте его в Excel.
Показать ещё 1 комментарий
Теги:

2 ответа

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

  • 2
    Ага. Пропустить Excel полностью . Немного о том, что «это также более 2 миллионов строк», - довольно хороший намек на то, что файл OP изначально не является файлом Excel ...
  • 0
    Действительно @Comintern ... данные могут быть в нескольких листах! Я видел безумные вещи, сделанные в Excel, забывая, что это не база данных.
Показать ещё 2 комментария
4

для запроса sql вы можете использовать substr и lpad

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню