Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск шаблона / 23 сообщений из 23, страница 1 из 1
28.06.2018, 03:53
    #39666873
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Добрый день.

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

PS В базу все коды могу положить в таком виде '^7495%'
...
Рейтинг: 0 / 0
28.06.2018, 04:14
    #39666874
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
А соединить по условию типа substr(номер телефона:3;len(код города))=код города
...
Рейтинг: 0 / 0
28.06.2018, 05:38
    #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
28.06.2018, 11:38
    #39667039
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Спасибо за Ваш ответ.

Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны.
У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность.
...
Рейтинг: 0 / 0
28.06.2018, 11:44
    #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
28.06.2018, 12:09
    #39667059
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Т.Е. коды с большей длинной имеют больший приоритет.
Осталось сгруппировать и выбрать код с большим приоритетом
...
Рейтинг: 0 / 0
28.06.2018, 12:10
    #39667062
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Если нет желания переработать таблицу кодов до единой длинны.
...
Рейтинг: 0 / 0
28.06.2018, 12:28
    #39667069
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Если бы можно было положить в таблицу префикс в виде регулярного выражения типа ^904х, то никаких проблем.
А иначе, заводить все коды каждой деревни - это ж какая таблица :)
...
Рейтинг: 0 / 0
28.06.2018, 12:30
    #39667071
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Зачем "для каждой". Достаточно только для тех регионов. где есть "исключения".
...
Рейтинг: 0 / 0
28.06.2018, 12:35
    #39667076
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше.
И у каждого свой префикс.
...
Рейтинг: 0 / 0
28.06.2018, 12:39
    #39667083
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Значит надо идти по приоритету большего кода
...
Рейтинг: 0 / 0
28.06.2018, 13:23
    #39667134
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Подредактировал http://sqlfiddle.com/#!17/8888d/7
Критика принимается.
Выводится 2, но можно же взять первый результат.
...
Рейтинг: 0 / 0
28.06.2018, 13:33
    #39667144
Rad1875
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Нет, не то.
...
Рейтинг: 0 / 0
28.06.2018, 13:47
    #39667158
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Rad1875"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше.
И у каждого свой префикс.
ну такие базы из инета можно скачать
как базу индексов, например
только нафиг они надо, только сотовым операторам и прочим опсосам
...
Рейтинг: 0 / 0
28.06.2018, 13:50
    #39667161
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск шаблона
Rad1875Спасибо за Ваш ответ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

а лайк я бы оставил на минимальную длину префикса. если бы ТОТ же индекс неопсовый умел и лайк.
...
Рейтинг: 0 / 0
28.06.2018, 22:29
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск шаблона / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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