Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885

Как правильно составить запрос для поиска телефона

24.10.2020, 19:27. Показов 2596. Ответов 37

Студворк — интернет-сервис помощи студентам
Примерно речь о том, я ввожу число 23329873827
Из этого составляю паттерны вида
2_332_987_3827
Затем формирую запрос like %2_332_987_3827%
Это задача, первое что возникло у меня, о предпологаемом решении о поиске номеров телефонах по введенному фильтру.
Да, действительно, запросы достают нужные телефоны по фильтру, но как их ускорить, я не вижу вариантов.

Задумка, чтобы уже при вводе 2332 - вернуло 2-332-987-3827
Возможно существует простой запрос, игнорирующий не числа или нужно писать процедуру и использовать ее при запросе(что тоже проще). Но, пока, такое решение через Expression формирование запроса, меня устроило.

Конечно же надо уходить от этого, иначе, такие запросы съедят всю память... System.OutOfMemoryException
Всем привет, изначально создал тему тут: Разбить строку на множество подстрок
Хочу использую Expression, сформировать запрос в бд и найти нужный мне телефон.

Но такой вариант, описанный по ссылке, ну и перенесу код сюда
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var digits = new string(value.Where(char.IsDigit).ToArray());
var digitsLength = digits.Length;
var variables = 1 << digitsLength;
var resultVariables = new List<List<int>>(variables);
 
for (int index = 0; index < variables; index++)
{
    var splits = new List<int>(digitsLength);
 
    for (int n = 0; n < digitsLength - 1; n++)
    {
        var x = index & (1 << n);
        if (x != 0)
        {
            splits.Add(n);
        }
    }
    resultVariables.Add(splits);
}
Формирует большие запросы, и соответственно, долгие, и едят много памяти.
Возможно есть более простое решение, как сделать запрос и проигнорировать не числовые символы.

Добавлено через 12 минут
Нагуглил вариант, возможно, это и будет решением
SQL
1
$sql = "SELECT * FROM tbl WHERE replace(replace(replace(replace(phone,'(',''),')',''),' ',''),'-','') LIKE concat(replace(replace(replace(replace('".$num."','(',''),')',''),' ',''),'-',''), '%')";
Добавлено через 11 минут
Только сейчас подумал, нет возможности проверить. Запрос вида replace(/^\d/gi, '') , использовал js синтаксис, так проще сформировать, может подойти. Сделать реплейс в запросе через c#, но вот с формируется-ли запрос, или выполнится на стороне клиента...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2020, 19:27
Ответы с готовыми решениями:

Как правильно создать запрос на сайт для поиска требуемых ссылок?
С сайта http://tululu.org/l101/10/ хочу получить ссылки при &quot; грабере &quot; этой страницы с кодом подобной &lt;a...

Как правильно составить маску для поиска номеров телефонов?
Вобщем хочу написать парсер который будет ходить по сайту и собирать телефонные номера. Да вот только для этого нужно правильно сделать...

Как правильно составить пост запрос? Для отправки сообщения в чат
Доброго времени суток! Собственно вот мой String request = &quot;http://www7.cbox.ws/box/index.php?&quot;; String...

37
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.10.2020, 00:51
Телефонный номер - строка цифр.
Вот в БД и определите его как число. А при выборке можете представлять его в нужном шаблоне.
Поиск по числовому полю будет очень быстрым.
Если нужно по первым цифрам, то можно в Базе рядом с числовым номером держать строковый, к которому применять like. На это поле навесить вторичный индекс.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
25.10.2020, 01:17
MsGuns, в родительской теме Разбить строку на множество подстрок я уже предлагал подобное решение: создать производное поле от номера телефона, в котором будут только числовые символы из него и искать по нему обычным Contains (это на C#, как будет в SQL - не знаю).

Но EveKS ответил, что БД не его и он не может влиять на её структуру.

Я плохо разбираюсь в БД, может есть какая-то возможность дополнить динамически существующую БД нужными значениями, или создать другую БД связанную с заданной....
Может ещё что-то придумать.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.10.2020, 02:13
Элд Хасп,
Просмотрел указанную ветку.

1. Так и не увидел что за тип БД
2. Так и не понял, какие права на БД имеет ТС.
3. При чем тут DataBase First ? Можно на самом сервере создать все, что угодно, включая индексы, хранимки и т.д.
Нельзя прикрутить поле к базовой таблице ? И что - конец света ? Можно создать View с требуемым цифровым полем например и ее уже промапировать в Модель, которой и совать like.
4. Может, я чего-то не понял, но мне показалось, что ТС пытается на 90% оптимизировать код на клиенте, т.е. в шарпе.
Это не хорошее решение - надо долбать сервер. Вторичные индексы, UDF, планы запросов, временные таблицы, курсоры и т.д. - вариантов миллион.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
25.10.2020, 02:19
Цитата Сообщение от MsGuns Посмотреть сообщение
Просмотрел указанную ветку.
Ну, я не шибко в этом разбираюсь - не смогу ни чего уточнить.

Только слова самого ТС:
Цитата Сообщение от EveKS Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Цитата Сообщение от EveKS Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Специалисты подскажут лучше, но я бы в БД хранил кроме Представления телефона, ещё и его Значение в котором только цифровые символы.
Это , конечно, если вы можете, сами влиять на структуру БД.
Элд Хасп, влиять не могу, мало того - db first
Не в вашем приложении?
В чужом?
Нет не в моем
Цитата Сообщение от MsGuns Посмотреть сообщение
4. ...Это не хорошее решение
Поэтому я посоветовал ТС обратиться в этот раздел.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.10.2020, 02:40
Когда-то решал подобную задачку на большой базе (по тем временам большой - что-то около 500000 записей). Надо было поиск по фамилиям убыстрить. БД была допотопной - Paradox. Решение нашли введя дополнительный ключ-поле - первые 2 буквы фамилий.
Скорость сразу же резко возросла.

С базами работаю с начала 90-х. Понял одно железно - лучше и быстрее, чем сервер, поиск в базе никто не выполнит. Поэтому надо правильно проектировать базы данных + использовать по максимуму возможности SQL-серверов.

Добавлено через 2 минуты
Элд Хасп,
Вы дали правильное направление.
Я тоже не эксперт, просто есть некоторый опыт работы с разными SQL-серверами. И как прикладной программист и как архитектор СУБД.

Добавлено через 9 минут
Тут еще вот какая штукенция.
Вовсе не эксперт, но кое-что могу подсказать.

Полнотекстовый поиск (а like именно к нему и относится, особенно если еще насовать в запрос разные касты и реплейсы) - одна из "ахиллесовых пят" большинства SQL-серверов.
ORACLE, например, решает эту задачу чуть ли не лучше всех. Но этот сервер весьма чувствителен к "тонкой" настройке запросов, а именно играм с планами запросов. Эффект может быть просто фантастичен - на своем опыте знаю Но тут нужен спец в оракле
MS SQL с длинными строками работает заметно хуже - помогают вторичные индексы или распараллирование запросов - но тут тоже нужны эксперты.
My SQL - просто телега по сравнению с первыми двумя. Хотя, возможно, за последние 10 лет ситуация поменялась
PostgeSQL - добротный легкий надежный "байк" - базы до 1млн записей крутит не хуже оракла, включая полнотекстовый.
InterBase(Firebird) - давно с ним не работал, но ребята говорили, что не оракл, конечно, но с мелкомягким вполне спорит.

Добавлено через 1 минуту
В общем, я бы советовал ТС сходить на SQL.ru или даже на Стэк - там водятся монстры по базам

Добавлено через 7 минут
Тут вот подумал еще.. Может не лишним будет
Многажды проектировал базы, где были телефонные номера. Но ни разу не помню, чтобы кому-то приходило в голову требовать интерфейс с поиском или фильтрацией данных по номерам телефонов.
Ищут обычно по фамилии, адресу, конторе и т.д.

Возможно, ТС что-то не договаривает, шифруется
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
25.10.2020, 08:16  [ТС]
MsGuns, спасибо за слова
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
25.10.2020, 08:40
Цитата Сообщение от MsGuns Посмотреть сообщение
Но ни разу не помню, чтобы кому-то приходило в голову требовать интерфейс с поиском или фильтрацией данных по номерам телефонов.
Элементарный пример: набор номера на телефоне.
По мере набора выходит подсказка со списком походящих телефонов.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.10.2020, 12:25
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Элементарный пример: набор номера на телефоне.
По мере набора выходит подсказка со списком походящих телефонов.
Стесняюсь спросить: А этот список откуда берется ? Из того, что в телефоне/симке или из откуда ? И там 100500 телефонов ?
Пример не удачный

Цитата Сообщение от EveKS Посмотреть сообщение
Спасибо за слова
А Вам надо код ?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
25.10.2020, 23:14  [ТС]
MsGuns,
3. При чем тут DataBase First ? Можно на самом сервере создать все, что угодно, включая индексы, хранимки и т.д.
Писал, нет возможности влиять на бд, вопросы к бизнесу о почему, не ко мне.
Нельзя прикрутить поле к базовой таблице ? И что - конец света ? Можно создать View с требуемым цифровым полем например и ее уже промапировать в Модель, которой и совать like
это очевидные вещи, как говорить почему << а не Math.Pow
Может, я чего-то не понял, но мне показалось, что ТС пытается на 90% оптимизировать код на клиенте, т.е. в шарпе.
Если говорить. Об этом. То логичнее создать тему в sql ветке, и говорить уже о совсем другом, а не о конкретном решении. А о том, что знает любой базист. Что было бы глупо, ибо гугл выдаст ответ в первом же запросе на подобный вопрос.
Когда-то решал подобную задачку на большой базе (по тем временам большой - что-то около 500000 записей). Надо было поиск по фамилиям убыстрить. БД была допотопной - Paradox. Решение нашли введя дополнительный ключ-поле - первые 2 буквы фамилий.
Скорость сразу же резко возросла.

С базами работаю с начала 90-х. Понял одно железно - лучше и быстрее, чем сервер, поиск в базе никто не выполнит. Поэтому надо правильно проектировать базы данных + использовать по максимуму возможности SQL-серверов.
Спасибо конечно, но это опять абстрактный разговор, о том, что можно было бы =)
Но ни разу не помню, чтобы кому-то приходило в голову требовать интерфейс с поиском или фильтрацией данных по номерам телефонов.
3 вас все ещё впереди
Поэтому, не в обиду, но это простой разговор.
А Вам надо код ?
А он есть)? RegExp. Replace, попробую, посмотрю, какой запрос сформирует.

Если 7оворить о том, что можно было бы... То самое простое, это или вьюаер или функция, функция была бы лучшим вариантом. Ибо речь о формировании iquerible через expression. Вьювер это лишнее, ибо пришлось ещё и его бы поддерживать. Но это можно было бы, но не в этом случае.

Не по теме:

писал с тклефона

0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
26.10.2020, 01:07
Цитата Сообщение от EveKS Посмотреть сообщение
Писал, нет возможности влиять на бд
Вот это уже конкретика

Еще бы поподробнее о формализации условий выборки, ибо в топике как-то очень уж "универсально".
Неужели есть необходимости искать по фрагментам-серединкам ? Т.е. номер, содержащий '123' где-то посередине, а не в начале и не в конце.
Вы уж простите, но я действительно не понимаю зачем такое нужно
Разве что заказчик требует, а его "каприз" - наши проблемы

И еще хотя бы примерно размеры таблицы (порядок в нулях)

Добавлено через 4 минуты
Цитата Сообщение от EveKS Посмотреть сообщение
Вьювер это лишнее, ибо пришлось ещё и его бы поддерживать
Вот это я не понял. Под "вьювером" имеется в виду VIEW в БД ? Если да, то что значит его "поддержка",- включение в модель ? Но этого ведь не нужно. Или "поддержка" это включение его в БЛ SQL-сервера ?

Добавлено через 8 минут
Ясно одно (для меня во всяком случае) - решить такую задачу (оптимизацию) средствами "штатной" ORM (например EF) крайне сложно, если вообще возможно.
Можно, например, соорудить скрипт для рулежки сервером как надо, т.е. фактически написать SQL-программу, которую запускать через SQLClient, а результат уже пихать в модель.

И что за SQL-сервер ? Если MS SQL, то я бы попробовал смоделировать вариантик.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.10.2020, 13:40  [ТС]
MsGuns,
Так, в очередной раз, нельзя влиять на ДБ
Цитата Сообщение от MsGuns Посмотреть сообщение
И что за SQL-сервер ?
MS SQL

Пока меня устроил вариант с
Regex.Replace(x.Phone ?? "", @"[^\d]", "")
Быстрее не стало, но теперь не ест память (уже прогресс)

Цитата Сообщение от MsGuns Посмотреть сообщение
VIEW в БД
Да речь о нем, но это речь о том, что можно было бы, но не в данной ситуации
-----
Думаю, если у бизнеса возникнет вопрос, а как ускорить, тогда я полезу в бд. Сейчас же, это чисто моя хотелка, ибо вариант с генерацией вариантов, красивый, но запросы очень большие, я о генерируемых sql запросах.
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
26.10.2020, 13:43
EveKS, а кто и на что вообще память ест-то?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.10.2020, 13:47  [ТС]
Usaga,
Цитата Сообщение от EveKS Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var digits = new string(value.Where(char.IsDigit).ToArray());
var digitsLength = digits.Length;
var variables = 1 << digitsLength;
var resultVariables = new List<List<int>>(variables);
for (int index = 0; index < variables; index++)
{
 var splits = new List<int>(digitsLength);
for (int n = 0; n < digitsLength - 1; n++)
 {
 var x = index & (1 << n);
 if (x != 0)
 {
 splits.Add(n);
 }
 }
 resultVariables.Add(splits);
Если дальше собрать запрос (ef core генерирует), получаются большие строки. Скажем для 11+ значных чисел
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
26.10.2020, 13:51
Цитата Сообщение от EveKS Посмотреть сообщение
var variables = 1 << digitsLength;
А это зачем?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.10.2020, 13:52  [ТС]
Usaga,
А это зачем?
общее число вариантов
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
26.10.2020, 13:54
EveKS, я в исходной задаче не вижу такого требования.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.10.2020, 13:58  [ТС]
Usaga,
я в исходной задаче не вижу такого требования
Разбить строку на множество подстрок
Сомневаюсь, что тут сложно понять по иному, кроме как найти количество вариантов. Найти варианты.
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
26.10.2020, 14:02
EveKS, зачем это делать? Вам же нужно только цифры сравнивать? Зачем пытаться составить список всех возможных вариантов номеров с подчёркиваниями, когда можно просто выкидывать подчёркивания и сравнивать только цифры?

Добавлено через 2 минуты
Кстати, а номера телефонов хранятся в своём отдельном поле или где-то в теле большего текста?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.10.2020, 14:02  [ТС]
Usaga, хорошо, как засунуть это в iqueryable условие? Кроме как регулярной
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2020, 14:02
Помогаю со студенческими работами здесь

Как правильно сделать запрос поиска в базе данных?
Здравствуйте. Подскажите пожалуйста, как решить задачу: Есть таблица БД: tbl_post с объявлениями. Есть поле в этой таблице: ...

Как правильно составить GET-запрос к RIPE NCC, чтобы получить поля "descr" и пр. для IP
Здравствуйте. Сабж :) Мне требуется правильно составить REST-запрос к RIPE Database, чтобы получать для IP все возможные поля....

Как правильно составить запрос?
Помогите переделать запрос! Нужно в печатной формы документа &quot;ИнвентаризацияТоваровНаСкладе&quot; добавить код партии. Код партии должен...

Как правильно составить запрос
Есть три таблицы: select * from jobs; ...

Как составить правильно запрос
Доброго дня, уважаемые форумчане! Совсем запутался, помогите составить правильный запрос. Есть таблицы Agreements Tariffs и Dates, при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru