|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Добрый день. Я не оговорился - нужен поиск не по шаблону, а собственно шаблона. Задача вроде простая - есть таблица телефонных кодов городов и тарифов на каждое направление. Москва (495) - 1 руб, Питер (812) - 2 руб и т.д. Требуется по номеру телефона определить код города, вытащить тариф и посчитать стоимость звонка. Так и получается, что в базе лежат шаблоны, которые надо найти. Коды бывают 3-, 4-, 5-значные Крутил по всякому regexp_matches, но похоже не то что нужно. Подскажите, люди добрые, в какую сторону копать :) PS В базу все коды могу положить в таком виде '^7495%' ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 03:53 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
А соединить по условию типа substr(номер телефона:3;len(код города))=код города ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 04:14 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Примерно так: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 05:38 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Спасибо за Ваш ответ. Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны. У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 11:38 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Rad1875Спасибо за Ваш ответ. Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны. У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность. C самого начала было ясно что телефония и префиксы да, больше нигде такое не вылезает. Вам вот сюда вот https://github.com/dimitri/prefix -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 11:44 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Т.Е. коды с большей длинной имеют больший приоритет. Осталось сгруппировать и выбрать код с большим приоритетом ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:09 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Если нет желания переработать таблицу кодов до единой длинны. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:10 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Если бы можно было положить в таблицу префикс в виде регулярного выражения типа ^904х, то никаких проблем. А иначе, заводить все коды каждой деревни - это ж какая таблица :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:28 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Зачем "для каждой". Достаточно только для тех регионов. где есть "исключения". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:30 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше. И у каждого свой префикс. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:35 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Значит надо идти по приоритету большего кода ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 12:39 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Подредактировал http://sqlfiddle.com/#!17/8888d/7 Критика принимается. Выводится 2, но можно же взять первый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 13:23 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Rad1875"Исключения" вовсе не исключения, а правило - всегда есть город, а вокруг деревни или городки поменьше. И у каждого свой префикс. ну такие базы из инета можно скачать как базу индексов, например только нафиг они надо, только сотовым операторам и прочим опсосам ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 13:47 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Rad1875Спасибо за Ваш ответ. Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны. У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность. если у вас работа со всякими exUSSR, где пятизначные номера и прочая чёрная магия, при этом ещё и разной длины префиксы, а к вам приходит просто набор цифр (даже ничем не разделённый), то вы просто мазохист. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 13:50 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Maxim BogukRad1875Спасибо за Ваш ответ. Один существенный момент - речь идет об IP-телефонии, где тариф на областной центр (из примера - Калуга 9042) и область (код 904) различны. У меня вот что получилось http://sqlfiddle.com/#!17/007aed/3 - выбираются оба направления, а должна быть однозначность. C самого начала было ясно что телефония и префиксы да, больше нигде такое не вылезает. ... похожее много где вылезает. найти ключевые слова(фразетты) в таблице ключевых с весами и т.п... а тут я бы где то триграммчик попытал. наверное. если бы придумал с какого конца. немного странно, что хотят шаблон а не префикс. задачи принципиально разной мощности. навскид. творцы гин -- индеска могли бы поделится, кстати. они же триграммов. (из-за них префиксы стоят несортированы -- пусть отдуваются) ещё один заход -- видимо аналог триграма -- индексировать массивы цифр бицифр и трицифр. гинами или т.р. ну и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 15:26 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
qwwq, Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут". -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 15:32 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Rad1875, хотя человек не знающий sql--оператора "like" должен страдать, даже если б пж не испортили паттерн опсами. опять таки если в кодах у вас битая цифра -- достаточно прстого текстового индекса и операторов сравнения > < <= >= = ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 15:32 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
[quot Maxim Boguk]qwwq, Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут". Maxim Boguk, могут :) Сказано в первом посте - хотят тариф, чтобы обсчитать звонок. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 18:36 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Всем спасибо за отклики! В принципе задачка решилась просто, просто я по незнанию пошел в регулярку :) Спасибо 982183 за substring, спасибо qwwq за ключевое слово LIKE :) Признаю, что не знаю не то что Postgre, но и, о ужас, SQL. Просто на старости лет захотелось чего то :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 18:43 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
[quot Rad1875]Maxim Bogukqwwq, Я сильно думаю что хотят все таки префикс. Просто "сказать внятно не могут". Maxim Boguk, могут :) Сказано в первом посте - хотят тариф, чтобы обсчитать звонок. IP телефония ВСЕГДА тарифицируется не по регуляркам а по префиксам... о чем я вам и написал. И привел ссылку на модуль который специально для этого сделан. Телефон 79999100000 совсем не должен тарифицироваться по тарифу от 910 как легко догадаться. PS: вариант через LIKE будет ну очень неторопливый. Вы же не спросили: "как быстро искать". -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 18:54 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Maxim Boguk... PS: вариант через LIKE будет ну очень неторопливый. Вы же не спросили: "как быстро искать". -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru поиск обратный , т.ч ни лайк ни регулярки не нужны. нужны поиски по префиксам от самого длинного. к короткому. //причем вероятно они лягут на одну страничку. если бтри. не больше индекс--сиков по таблице тарифов, чем длина самого длинного префикса. Код: sql 1.
битмап ор обычный. а лайк я бы оставил на минимальную длину префикса. если бы ТОТ же индекс неопсовый умел и лайк. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 20:43 |
|
Поиск шаблона
|
|||
---|---|---|---|
#18+
Пока остановился на таком варианте: select rate from tarifs where substring(:destination_number from 1 for char_length(code))=code order by code asc Вызывается из Lua - вроде работает. Вне зависимости от того. сколько строк находится, результат будет из последней - то что нужно. Maxim Boguk, спасибо за ссылку, но я там с ходу не разобрался. Может позже. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 22:29 |
|
|
start [/forum/topic.php?fid=53&msg=39667413&tid=1995699]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
208ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 332ms |
0 / 0 |