У меня есть таблица, заполненная произвольно отформатированными телефонными номерами, например,
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 «решениях»
- Взломайте франк-запрос
CONCAT
и SUBSTR
- Вставьте
%
между каждым символом иглы (вот так: %0%7%1%2%3%4%5%6%
)
Однако ни одно из этих решений не выглядит особенно элегантным.
Надеюсь, кто-нибудь может помочь, или я могу быть вынужден использовать решение %%%%%%
Обновление: работает с относительно фиксированным набором данных, возможно, с несколькими сотнями строк. Я просто не хотел делать что-то смехотворно плохое, чтобы будущие программисты заплакали.
Если набор данных будет расти, я использую метод phoneStripped. Спасибо за все отзывы!
не могли бы вы использовать функцию "заменить", чтобы удалить любые экземпляры "(", "-" и "",
Меня не беспокоит, что результат будет числовым.
Главные персонажи, которых я должен рассмотреть: +
, -
, (
, )
и space
Так будет ли это решение выглядеть так?
SELECT * FROM people
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '('),')'),'-'),' '),'+')
LIKE '123456'
Разве это не было бы ужасно медленно?