Вы можете использовать numrange
для этой цели. Описание здесь .
Например:
With SalaryRanges(SalaryRange) AS (
VALUES(NumRange(0,5000)), (Numrange(5000,10000)), (NumRange(10000,15000)), (NumRange(15000,25000)), (NumRange(25000,50000)), (NumRange(50000,100000)), (NumRange(100000,150000))
),
Salary(id, amount, currency, label) as (
SELECT UNNEST(ARRAY['A','B','C','D','E','F']),
UNNEST(ARRAY[11111,5000,45000,100000,110000,670000]::numeric[]),
UNNEST(ARRAY['USD','EUR', 'RMB', 'USD','EUR', 'RMB']),
UNNEST(ARRAY['1A','5B','3P','6Q','2C','7F'])
)
SELECT *
FROM Salary S
JOIN SalaryRanges SR on SalaryRange @> Amount
Если вы решите сохранить диапазоны в таблице, вы, вероятно, захотите создать исключающее ограничение .
В противном случае вам нужно будет решить, что делать с перекрывающимися диапазонами.