У меня есть таблица, которая заполнена произвольно отформатированными телефонными номерами, например
027 123 5644
021 393-5593
(07) 123 456
042123456
Мне нужно найти номер телефона в произвольно подобранном формате (например, 07123456
должен найти запись (07) 123 456
То, как я делаю это на обычном языке программирования, - это вывести все символы из цифр, отличных от цифр, и пройти через каждый номер в стоге сена, вывести из него все несимметричные символы, затем сравните с иглой, например (в рубине).
digits_only = lambda{ |n| n.gsub /[^\d]/, '' }
needle = digits_only[input_phone_number]
haystack.map(&digits_only).include?(needle)
Уловка, мне нужно сделать это в MySQL. Он содержит множество строковых функций, ни одна из которых действительно не делает то, что я хочу.
В настоящее время я могу думать о 2 решениях
- Взломайте запрос franken
CONCAT
иSUBSTR
- Вставьте
%
между каждым символом иглы (так вот так:%0%7%1%2%3%4%5%6%
)
Однако ни одна из них не кажется особенно элегантными. Надеюсь, кто-то может помочь, или я могу быть вынужден использовать решение %%%%%%
Обновление: это работает с относительно фиксированным набором данных, возможно, несколько сотен строк. Я просто не хотел делать что-то смехотворное, что будущие программисты плакали.
Если набор данных будет расти, я возьму подход "phoneStripped". Спасибо за все отзывы!
Вы могли бы использовать функцию "replace", чтобы вырезать любые экземпляры "(", "-" и "",
Я не беспокоюсь о том, что результат является числовым.
Основные символы, которые мне нужно рассмотреть, это +
, -
, (
, )
и space
Так будет ли это решение выглядеть так?
SELECT * FROM people
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '('),')'),'-'),' '),'+')
LIKE '123456'
Не будет ли это ужасно медленным?