PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.0 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs sur les intervalles

9.20. Fonctions et opérateurs sur les intervalles

Voir Section 8.17 pour un aperçu les types d'intervalle.

Tableau 9.53 montre les opérateurs spécialisés disponibles pour les types d'intervalle. En plus de ces derniers, les opérateurs de comparaison habituels montrés dans Tableau 9.1 sont disponibles pour les types d'intervalle. Les opérateurs de comparaison trient d'abord par les limites basses de l'intervalle et seulement si ces dernières sont identiques, par les limites hautes. Ceci ne donne généralement pas de résultat utile pour un tri, mais les opérateurs sont fournis pour autoriser la création d'index d'unicité sur des intervalles.

Tableau 9.53. Opérateurs sur les intervalles

Opérateur

Description

Exemple(s)

anyrange @> anyrangeboolean

Est-ce que le premier intervalle contient le second ?

int4range(2,4) @> int4range(2,3)t

anyrange @> anyelementboolean

Est-ce que l'intervalle contient l'élément ?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestampt

anyrange <@ anyrangeboolean

Est-ce que le premier intervalle est contenu par le second ?

int4range(2,4) <@ int4range(1,7)t

anyelement <@ anyrangeboolean

Est-ce que l'élément est contenu dans l'intervalle ?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

Est-ce que les intervalles se surchargent, c'est-à-dire ont-ils des éléments en commun ?

int8range(3,7) && int8range(4,12)t

anyrange << anyrangeboolean

Est-ce que le premier intervalle se trouve strictement à gauche du second ?

int8range(1,10) << int8range(100,110)t

anyrange >> anyrangeboolean

Est-ce que le premier intervalle se trouve strictement à droite du second ?

int8range(50,60) >> int8range(20,30)t

anyrange &< anyrangeboolean

Est-ce que le premier intervalle ne s'étend pas à droite du second ?

int8range(1,20) &< int8range(18,20)t

anyrange &> anyrangeboolean

Est-ce que le premier intervalle ne s'étend pas à gauche du second ?

int8range(7,20) &> int8range(5,10)t

anyrange -|- anyrangeboolean

Les deux intervalles sont-ils adjacents ?

numrange(1.1,2.2) -|- numrange(2.2,3.3)t

anyrange + anyrangeanyrange

Calcule l'union des intervalles. Les intervalles doivent se surcharger ou être adjacents, pour que l'union soit un intervalle simple (cependant voir range_merge()).

numrange(5,15) + numrange(10,20)[5,20)

anyrange * anyrangeanyrange

Calcule l'intersection des intervalles.

int8range(5,15) * int8range(10,20)[10,15)

anyrange - anyrangeanyrange

Calcule la différence des intervalles. Le deuxième intervalle ne doit pas être contenu dans le premier de tel façon que la différence ne formerait pas un intervalle simple.

int8range(5,15) - int8range(10,20)[5,10)


Les opérateurs gauche-de/droite-de/adjacent renvoient toujours false quand un intervalle vide est impliqué ; autrement dit, un intervalle vide n'est pas considéré être avant ou après tout intervalle.

Tableau 9.54 montre les fonctions disponibles avec les types d'intervalle.

Tableau 9.54. Fonctions d'intervalle

Fonction

Description

Exemple(s)

lower ( anyrange ) → anyelement

Extrait la limite basse de l'intervalle (NULL si l'intervalle est vide ou si la limite basse est infinie).

lower(numrange(1.1,2.2))1.1

upper ( anyrange ) → anyelement

Extrait la limite haute de l'intervalle (NULL si l'intervalle est vide ou si la limite haute est infinie).

upper(numrange(1.1,2.2))2.2

isempty ( anyrange ) → boolean

Est-ce que l'intervalle est vide ?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

Est-ce que la limite basse de l'intervalle est inclus ?

lower_inc(numrange(1.1,2.2))t

upper_inc ( anyrange ) → boolean

Est-ce que la limite haute de l'intervalle est inclus ?

upper_inc(numrange(1.1,2.2))f

lower_inf ( anyrange ) → boolean

Est-ce que la limite basse de l'intervalle est infinie ?

lower_inf('(,)'::daterange)t

upper_inf ( anyrange ) → boolean

Est-ce que la limite haute de l'intervalle est infinie ?

upper_inf('(,)'::daterange)t

range_merge ( anyrange, anyrange ) → anyrange

Calcule le plus petit intervalle incluant les deux intervalles.

range_merge('[1,2)'::int4range, '[3,4)'::int4range)[1,4)


Les fonctions lower_inc, upper_inc, lower_inf et upper_inf renvoient toutes false pour un intervalle vide.