Поиск номеров телефона в mysql

Вы можете filter массив с закрытием:

var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 }  // <= returns [3]

И вы можете подсчитать массив:

filtered.count // <= returns 1

. Таким образом, вы можете определить , если массив включает ваш элемент, объединив их:

myList.filter { $0 == 3 }.count > 0  // <= returns true if the array includes 3

Если вы хотите найти позицию, я не вижу причудливого пути, но вы можете сделать это следующим образом:

var found: Int?  // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
    if x[i] == 3 {
        found = i
    }
}

EDIT

Пока мы находимся в этом, для забавного упражнения продолжим Array, чтобы иметь способ find:

extension Array {
    func find(includedElement: T -> Bool) -> Int? {
        for (idx, element) in enumerate(self) {
            if includedElement(element) {
                return idx
            }
        }
        return nil
    }
}

Теперь мы можем это сделать:

myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found
11
задан Vadim Kotov 10 October 2017 в 10:07
поделиться

11 ответов

Это похоже на проблему от запуска. Любой вид поиска Вас делает потребует сканирования таблицы, и все мы знаем, что это плохо.

Как насчет того, чтобы добавить столбец с хешем текущих номеров телефона после снятия всех символов форматирования. Затем можно, по крайней мере, индексировать значения хэш-функции и избежать полноценного сканирования таблицы.

Или действительно ли объем данных является небольшим и не ожидаемый вырасти очень? Затем, возможно, просто при всасывании всех чисел в клиент и запущении поиска там.

11
ответ дан 3 December 2019 в 04:15
поделиться

Горе - я. Я закончил тем, что делал это:

mre = mobile_number && ('%' + mobile_number.gsub(/\D/, '').scan(/./m).join('%'))

find(:first, :conditions => ['trim(mobile_phone) like ?', mre])
0
ответ дан 3 December 2019 в 04:15
поделиться

если это - что-то, что собирается произойти, регулярно, возможно, изменяя данные, чтобы быть всем одним форматом и затем установить поисковую форму для разделения любого неалфавитно-цифрового (если бы Вы позволяете числа как С 310 ЗВОНКАМИ), была бы хорошая идея. Наличие данных в легко искавшем формате является залогом успеха.

0
ответ дан 3 December 2019 в 04:15
поделиться

Просто идея, но разве Вы не могли использовать Regex, чтобы быстро разделить символы и затем выдержать сравнение с тем как @Matt предложенный Hamilton?

Возможно, даже настройте представление (не уверенный в mysql на представлениях), который содержал бы все номера телефона, разделенные regex к простому номеру телефона?

0
ответ дан 3 December 2019 в 04:15
поделиться

MySQL может искать на основе регулярных выражений.

Несомненно, но, учитывая произвольное форматирование, если мой стог сена содержится "(027) 123 456" (примите во внимание, что положение пробелов может измениться, это могло столь же легко быть 027 12 3456 и я хотел соответствовать ему 027123456, мой regex должен был бы поэтому быть этим?

"^[\D]+0[\D]+2[\D]+7[\D]+1[\D]+2[\D]+3[\D]+4[\D]+5[\D]+6$"

(на самом деле это было бы хуже, поскольку mysql руководство, кажется, не указывает, что поддерживает \D)

Если это так, разве это не более или менее то же как моя %%%%% идея?

0
ответ дан 3 December 2019 в 04:15
поделиться

Действительно ли возможно выполнить запрос для переформатирования данных, чтобы соответствовать нужному формату и затем просто выполнить простой запрос? Тот путь, даже если начальное переформатирование является медленным Вы, оно действительно не имеет значения.

1
ответ дан 3 December 2019 в 04:15
поделиться

Это - проблема с MySQL - функция regex может соответствовать, но это не может заменить. См. это сообщение для возможного решения.

2
ответ дан 3 December 2019 в 04:15
поделиться

out-of-the-box идея, но Вы могли использовать функцию "замены" для разделения каких-либо экземпляров" (", "-" и "", и затем используют функцию "isnumeric", чтобы протестировать, является ли получившая строка числом?

Затем Вы могли сделать то же к строке номера телефона, которую Вы ищете и сравниваете их как целые числа.

Конечно, это не будет работать на числа как 1800 МАТОВЫХ СКАЛ.:)

2
ответ дан 3 December 2019 в 04:15
поделиться

Мое решение было бы чем-то вроде того, что сказал John Dyer. Я добавил бы второй столбец (например, phoneStripped), который разделяется на вставке и обновлении. Индексируйте этот столбец и поиск на нем (после разделения Вашего критерия поиска, конечно).

Вы могли также добавить триггер для автоматического обновления столбца, хотя я не работал с триггерами. Но как Вы сказал, действительно трудно написать код MySQL для разделения строк, таким образом, вероятно, легче просто сделать это в клиентском коде.

(Я знаю, что это поздно, но я только что начал смотреть здесь :)

2
ответ дан 3 December 2019 в 04:15
поделиться

Из perlfaq6 «Как использовать регулярное выражение для удаления комментариев в стиле C из файла?»:


Хотя это действительно можно сделать, это намного сложнее чем вы думаете. Например, этот однострочный

perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

будет работать во многих, но не во всех случаях. Видите ли, это слишком простовато для определенных типов программ на C, в частности, для тех, которые кажутся комментариями в строках в кавычках. Для этого вам понадобится что-то вроде этого, созданное Джеффри Фридлом и позднее измененное Фредом Кертисом.

$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;

Конечно, это можно было бы более разборчиво написать с помощью модификатора / x, добавив пробелы и комментарии. Здесь он расширен, любезно предоставлен Фредом Кертисом.

s{
   /\*         ##  Start of /* ... */ comment
   [^*]*\*+    ##  Non-* followed by 1-or-more *'s
   (
     [^/*][^*]*\*+
   )*          ##  0-or-more things which don't start with /
               ##    but do end with '*'
   /           ##  End of /* ... */ comment

 |         ##     OR  various things which aren't comments:

   (
     "           ##  Start of " ... " string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^"\\]        ##  Non "\
     )*
     "           ##  End of " ... " string

   |         ##     OR

     '           ##  Start of ' ... ' string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^'\\]        ##  Non '\
     )*
     '           ##  End of ' ... ' string

   |         ##     OR

     .           ##  Anything other char
     [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
   )
 }{defined $2 ? $2 : ""}gxse;

Небольшая модификация также удаляет комментарии C ++, возможно, занимающие несколько строк с использованием символа продолжения:

0
ответ дан 3 December 2019 в 04:15
поделиться

См.

http://www.mfs-erp.org/community/blog/find-phone-number-in-database-format-independent

На самом деле это не проблема, что регулярное выражение станет визуально ужасающим, поскольку только mysql "видит" его. Обратите внимание, что вместо '+' (см. Сообщение с [\ D] из OP) вы должны использовать '*' в регулярном выражении.

Некоторых пользователей беспокоит производительность (неиндексированный поиск), но в таблице с 100000 клиентов этот запрос, когда он отправлен из пользовательского интерфейса, возвращается немедленно, без заметной задержки.

1
ответ дан 3 December 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: