Выбор на основе списка чисел c диапазонов в Postgres - PullRequest
0 голосов
/ 14 июля 2020

У меня есть предопределенный список целочисленных диапазонов, например, 16 ... 32, 24 ... 40 и т. Д.

Каждая строка в таблице имеет один из этих диапазонов в одном столбце current. Также должен быть столбец accepted со списком диапазонов. Оба столбца никак не связаны напрямую.

Цель - когда у меня есть строка A с, например. current = 16...32 Я хочу найти все остальные строки, где accepted включает указанный диапазон c current. В идеале, сделайте это как часть того же запроса.

В моем наивном подходе у меня была бы отдельная таблица с этими диапазонами, идентифицированными с помощью идентификатора, а затем ссылка на него. Но видя, насколько надежен Postgres, я все время задавался вопросом, есть ли более простой способ.

Уточнение

Я бы сделал это так, но он кажется слишком громоздким. Предлагает ли Postgres что-то более лаконичное?

CREATE TABLE "ranges" (
  id integer
  min integer -- just for clarity
  max integer -- isn't considered for querying
)

CREATE TABLE "users" (
  id integer
  currentRangeId integer -- references ranges
)

CREATE TABLE "userRanges" (
  userId integer -- references users
  rangeId integer -- references ranges
)

В большинстве случаев у меня будет userId на входе, мне нужно найти его currentRangeId, а затем на выходе я ожидаю список других userId где rangeId = currentRangeId.

1 Ответ

0 голосов
/ 14 июля 2020

Вы можете использовать массивы:

  • current будет integer
  • accepted будет integer[]

Тогда запрос мог быть таким:

WHERE current = ANY (accepted)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...