Выберите диапазоны, содержащие значения - PullRequest
0 голосов
/ 30 августа 2018

У меня есть таблица, которая содержит диапазоны:

+----+------+----+
| id | from | to |
+----+------+----+
|  1 |    1 | 10 |
|  2 |   11 | 20 |
|  3 |   21 | 30 |
+----+------+----+

У меня есть список значений: (5, 7, 16)

Я хотел бы выбрать все диапазоны, которые содержат одно из следующих значений:

+-------+----------+
| value | range_id |
+-------+----------+
|     5 |        1 |
|     7 |        1 |
|    16 |        2 |
+-------+----------+

Или, может быть, только содержащиеся идентификаторы диапазона, я также могу работать с этим: (1, 2)

Я изучил numrange и использовал операторы диапазона , но я не нашел оператор для проверки нескольких значений.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы бы использовали оператор <@ (элемент содержится в):

WITH sample (id, "from", "to") AS (
    VALUES 
        (1, 1, 10),
        (2, 11, 20),
        (3, 21, 30)
)
SELECT 
    ranges.val,
    sample.id 
FROM 
    sample
    --You can inject you array of values in a call of unnest function to simplify your query
    JOIN UNNEST(ARRAY[5, 7, 16]) AS ranges(val) ON (ranges.val <@ int4range(sample."from", sample."to"));

Также избегайте использования зарезервированных слов, таких как «от» и «до». Избежать этого очень утомительно.

0 голосов
/ 30 августа 2018

Оператор диапазона - действительно путь:

select t.value, r.id
from ranges r
  join (values (5),(7),(16) ) as t(value)
    on t.value <@ int4range(r."from", r."to");

Создав «виртуальную таблицу» с помощью конструктора строк values() , можно также отобразить соответствующее значение.

Если вы ожидаете, что некоторые значения не совпадают, и вы хотите, чтобы эта информация использовала внешнее соединение:

select t.value, r.id
from ( values (5),(7),(16),(42) ) as t(value) 
  left join ranges r on t.value <@ int4range(r.from, r.to);

Онлайн пример: http://rextester.com/BIKSH85499

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