Korzystanie z PostgreSQL 9.4:Postgres int4range górna granica wartości nieoczekiwany
SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::numrange x) q;
> [1,2] | 1 | 2 -- looks OK
SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::int4range x) q;
> [1,3) | 1 | >>3<< -- this is unexpected
Sprawdźmy dalej:
SELECT x, lower(x), upper(x) FROM (SELECT '[1,3)'::numrange x) q1;
> [1,3) | 1 | 3 -- looks OK
SELECT x, lower(x), upper(x) FROM (SELECT '[1,3]'::numrange x) q1;
> [1,3] | 1 | 3 -- looks OK
Z dokumentacji pg:
górna (anyrange) | typ elementu zakresu | górna granica zakresu | górny (numrange (1.1,2.2)) | 2,2
Podczas 3
technicznie górna granica zakresu całkowitej [1,3) ∩ ℕ = {1, 2}
, więc są liczbami naturalnymi ≥ 2. byłoby oczekiwać, funkcja upper
zwraca Supremum (przynajmniej górna granica) zakresu.
Czy brakuje mi czegoś?
Tak, są przekształcane do postaci kanonicznej. A zakres [1,2] jest dokładnie taki sam jak [1,3] w N. Ale 3 w sup. żadnego z nich. – damians
@FireBiker tak, 3 nie jest supremum, ale jest górną granicą (według definicji PostgreSQL) '[1,3)'. Możesz użyć 'upper_inc()', aby wykryć, czy jest to element włączający czy nie. Myślę, że to dlatego, że w ten sposób funkcje są spójne (tj. Zarówno 'upper ('[1,3)' :: int4range)' i 'upper ('[1,3)' :: numrange)' daje '3') - pamiętaj, że supremum może być określane jako * najmniejsza górna granica *, podczas gdy PostgreSQL używa tylko terminu * górna granica * – pozs