powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск шаблона
23 сообщений из 23, страница 1 из 1
Поиск шаблона
    #39666873
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Я не оговорился - нужен поиск не по шаблону, а собственно шаблона.
Задача вроде простая - есть таблица телефонных кодов городов и тарифов на каждое направление.
Москва (495) - 1 руб, Питер (812) - 2 руб и т.д.
Требуется по номеру телефона определить код города, вытащить тариф и посчитать стоимость звонка.
Так и получается, что в базе лежат шаблоны, которые надо найти.
Коды бывают 3-, 4-, 5-значные
Крутил по всякому regexp_matches, но похоже не то что нужно.
Подскажите, люди добрые, в какую сторону копать :)

PS В базу все коды могу положить в таком виде '^7495%'
...
Рейтинг: 0 / 0
Поиск шаблона
    #39666874
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А соединить по условию типа substr(номер телефона:3;len(код города))=код города
...
Рейтинг: 0 / 0
Поиск шаблона
    #39666878
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так: http://sqlfiddle.com/#!17/90eb6/3

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    create table tel (nomer text);
    insert into tel (nomer)
    values
    ('^791420185654'),
    ('^791720181264'),
    ('^790420180338'),
    ('^790420180759');
    
    create table town (kod text, name text);
    insert into town (kod, name)
    values
    ('914', 'Москва'),
    ('917', 'СПБ'),
    ('9042', 'Калуга'),
    ('9043', 'Воронеж')


    select tel.nomer, town.name
      from tel, town
     where substring(tel.nomer from 3 for char_length(town.kod))=town.kod
    
    
    |         nomer |   name |
    |---------------|--------|
    | ^791420185654 | Москва |
    | ^791720181264 |    СПБ |
    | ^790420180338 | Калуга |
    | ^790420180759 | Калуга |
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667039
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за Ваш ответ.

Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны.
У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667044
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rad1875Спасибо за Ваш ответ.

Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны.
У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность.

C самого начала было ясно что телефония и префиксы да, больше нигде такое не вылезает.
Вам вот сюда вот
https://github.com/dimitri/prefix

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667059
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.Е. коды с большей длинной имеют больший приоритет.
Осталось сгруппировать и выбрать код с большим приоритетом
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667062
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет желания переработать таблицу кодов до единой длинны.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667069
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если бы можно было положить в таблицу префикс в виде регулярного выражения типа ^904х, то никаких проблем.
А иначе, заводить все коды каждой деревни - это ж какая таблица :)
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667071
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем "для каждой". Достаточно только для тех регионов. где есть "исключения".
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667076
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше.
И у каждого свой префикс.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667083
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит надо идти по приоритету большего кода
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667134
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подредактировал http://sqlfiddle.com/#!17/8888d/7
Критика принимается.
Выводится 2, но можно же взять первый результат.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667144
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, не то.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667158
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rad1875"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше.
И у каждого свой префикс.
ну такие базы из инета можно скачать
как базу индексов, например
только нафиг они надо, только сотовым операторам и прочим опсосам
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667161
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rad1875Спасибо за Ваш ответ.

Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны.
У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность.
если у вас работа со всякими exUSSR, где пятизначные номера и прочая чёрная магия, при этом ещё и разной длины префиксы, а к вам приходит просто набор цифр (даже ничем не разделённый), то вы просто мазохист.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667221
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukRad1875Спасибо за Ваш ответ.

Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны.
У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность.

C самого начала было ясно что телефония и префиксы да, больше нигде такое не вылезает.
...
похожее много где вылезает.
найти ключевые слова(фразетты) в таблице ключевых с весами и т.п...

а тут я бы где то триграммчик попытал. наверное. если бы придумал с какого конца.

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

творцы гин -- индеска могли бы поделится, кстати. они же триграммов.
(из-за них префиксы стоят несортированы -- пусть отдуваются)

ещё один заход -- видимо аналог триграма -- индексировать массивы цифр бицифр и трицифр. гинами или т.р.

ну и т.д.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667225
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут".

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667226
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rad1875,

хотя человек не знающий sql--оператора "like" должен страдать,
даже если б пж не испортили паттерн опсами.

опять таки если в кодах у вас битая цифра -- достаточно прстого текстового индекса и операторов сравнения > < <= >= =
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667327
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Maxim Boguk]qwwq,

Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут".

Maxim Boguk, могут :)
Сказано в первом посте - хотят тариф, чтобы обсчитать звонок.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667330
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за отклики!

В принципе задачка решилась просто, просто я по незнанию пошел в регулярку :)
Спасибо 982183 за substring, спасибо qwwq за ключевое слово LIKE :)
Признаю, что не знаю не то что Postgre, но и, о ужас, SQL.
Просто на старости лет захотелось чего то :)
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667336
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Rad1875]Maxim Bogukqwwq,

Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут".

Maxim Boguk, могут :)
Сказано в первом посте - хотят тариф, чтобы обсчитать звонок.

IP телефония ВСЕГДА тарифицируется не по регуляркам а по префиксам... о чем я вам и написал.
И привел ссылку на модуль который специально для этого сделан.
Телефон 79999100000 совсем не должен тарифицироваться по тарифу от 910 как легко догадаться.

PS: вариант через LIKE будет ну очень неторопливый. Вы же не спросили: "как быстро искать".

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667371
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk...
PS: вариант через LIKE будет ну очень неторопливый. Вы же не спросили: "как быстро искать".

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

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

Код: sql
1.
найти тариф где код В(7,74,749,7499,74991,...)


битмап ор обычный.

а лайк я бы оставил на минимальную длину префикса. если бы ТОТ же индекс неопсовый умел и лайк.
...
Рейтинг: 0 / 0
Поиск шаблона
    #39667413
Rad1875
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока остановился на таком варианте:

select rate from tarifs where substring(:destination_number from 1 for char_length(code))=code order by code asc

Вызывается из Lua - вроде работает.
Вне зависимости от того. сколько строк находится, результат будет из последней - то что нужно.
Maxim Boguk, спасибо за ссылку, но я там с ходу не разобрался. Может позже.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск шаблона
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]