2015-01-15 14 views
5

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?

risposta

1

Questo succede perché int4range è un discrete range. Tali intervalli sempre automaticamente convertiti loro rappresentazione canonica per essere in grado di testare equivalenza, f.ex .:

SELECT '[4,8]'::int4range = '(3,9)'::int4range 

Il built-in tipi di intervallo int4range, int8range e daterange usano tutti una forma canonica che include il limite inferiore ed esclude il limite superiore; ovvero, [). I tipi di intervallo definiti dall'utente possono tuttavia utilizzare altre convenzioni.

+0

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

+0

@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

0

La forma canonica della gamma [1,2] è [1,3). La funzione upper() restituisce il limite superiore della forma canonica.

select upper(int4range(1, 2, '[]')); -- Canonical form is '[1,3)' 
 
3 

Questo intervallo non contiene il valore 3.

select int4range(1, 2, '[]') @> 3; 
 
f 

C'è una funzione diversa da chiamare se avete bisogno di sapere se il valore restituito da superiore() è compreso.

select upper_inc(int4range(1, 2, '[]')); 
 
f