PostgreSQL, выберите лучшее соответствие из столбцов - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть таблица со следующей структурой в PostgreSQL:

table: phonenumbers

columns: user, cc, number_start, number_stop

user - это мой идентификатор пользователя, cc - это код страны, sn_start - это первый номер диапазона номеров, а sn_stop - это последний номер диапазона номеров.

Таблица phonenumbers может содержать несколько диапазонов номеров в пределах одного и того же кода страны, а в некоторых случаях диапазонов номеров вообще нет.

Итак, сначала я должен оштрафовать наибольшее / лучшее совпадение для cc, а затем наивысшее / наилучшее совпадение для number_start цикла до number_stop.

Как выбрать лучшее совпадение для данного числа, напр. 1802569984

Пример данных в таблице может быть:

user, cc, number_start, number_stop

1, 44, null, null
3, 1, null, null
3, 1, 800000000, 900000000
4, 1, 802000000, 803000000

В этом случае следует выбрать user с идентификатором 4, так как это наилучшее совпадение.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Немного более простой подход, это сработает?

SELECT p.*
FROM phonenumbers p
WHERE '1802569984' BETWEEN p.cc || p.number_start AND p.cc || p.number_stop
OR ('1802569984' LIKE (p.cc || '%') AND p.number_start IS NULL)
ORDER BY p.cc || p.number_start DESC NULLS LAST
LIMIT 1;
0 голосов
/ 05 сентября 2018

Вы можете сделать что-то вроде этого:

select e.*
from example e
where (e.number_start is null or 
       e.cc || e.number_start <= '1802569984'
      ) and
      (e.number_end is null or
       '1802569984' <= e.cc || e.numer_end
      )
order by e.cc desc,
         e.number_start desc nulls last,
         e.number_last asc nulls last
limit 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...