Utilizzando PostgreSQL 9.4:Postgres int4range limite superiore valore imprevisto
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
Controlliamo inoltre:
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
Da documentazione pg:
superiore (anyrange) | tipo di elemento dell'intervallo | limite superiore dell'intervallo | superiore (numrange (1.1,2.2)) | 2,2
Mentre 3
è tecnicamente un limite superiore del range intero [1,3) ∩ ℕ = {1, 2}
, lo sono anche tutti i numeri naturali ≥ 2. mi aspetterei la funzione upper
restituisce il estremo superiore (estremo superiore) della gamma.
Mi manca qualcosa?
sì, sono convertiti alla forma canonica. E l'intervallo [1,2] è esattamente lo stesso a [1,3) in N. Ma 3 nel sup. di nessuno dei due. – damians
@FireBiker yes, 3 non è il supremo, ma è il limite superiore (per definizione di PostgreSQL) di '[1,3)'. Puoi usare 'upper_inc()' per rilevare, se è incluso o no. Penso che sia perché in questo modo le funzioni sono coerenti (cioè sia 'upper ('[1,3)' :: int4range)' che 'upper ('[1,3)' :: numrange)' darà '3') - nota che supremum può essere indicato come * minimo limite superiore *, mentre PostgreSQL usa solo il termine * limite superiore * – pozs