Я загрузил набор данных из Интернета, и он был плохо форматирован. Почтовые индексы ломают мой сайт. Некоторые из них представляют собой полные 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?
Просто используйте чистый 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;
для запроса sql вы можете использовать substr и lpad
select lpad(substr(your_column, 1,5), 5, '0')
from your_table