9.20. Funções e operadores de intervalo e multi-intervalo #

Veja a Seção 8.17 para obter uma visão geral dos tipos dados de intervalo.

A Tabela 9.58 descreve os operadores especializados disponíveis para os tipos de dados intervalo. A Tabela 9.59 descreve os operadores especializados disponíveis para os tipos de dados multi-intervalo. Além desses, estão disponíveis para os tipos de dados intervalo e multi-intervalo os operadores de comparação usuais descritos na Tabela 9.1. Os operadores de comparação ordenam primeiro pelo limite inferior dos intervalos, e somente se estes forem iguais comparam os limites superiores. Os operadores multi-intervalo comparam cada intervalo até que algum não seja igual. Isto geralmente não resulta em uma ordenação geral útil, mas os operadores são fornecidos para permitir que sejam construídos índices únicos nos intervalos.

Tabela 9.58. Operadores de intervalo

Operador

Descrição

Exemplo(s)

anyrange @> anyrangeboolean

O primeiro intervalo contém o segundo intervalo?

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

anyrange @> anyelementboolean

O intervalo contém o elemento?

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

anyrange <@ anyrangeboolean

O primeiro intervalo está contido pelo segundo intervalo?

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

anyelement <@ anyrangeboolean

O elemento está contido no intervalo?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

Os intervalos se sobrepõem, ou seja, têm algum elemento em comum?

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

anyrange << anyrangeboolean

O primeiro intervalo está inteiramente à esquerda do segundo intervalo?

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

anyrange >> anyrangeboolean

O primeiro intervalo está inteiramente à direita do segundo intervalo?

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

anyrange &< anyrangeboolean

O primeiro intervalo não se estende à direita do segundo intervalo?

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

anyrange &> anyrangeboolean

O primeiro intervalo não se estende à esquerda do segundo intervalo?

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

anyrange -|- anyrangeboolean

Os intervalos são adjacentes?

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

anyrange + anyrangeanyrange

Calcula a união dos intervalos. Os intervalos devem se sobrepor ou serem adjacentes, para que a união seja um único intervalo (mas veja range_merge()).

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

anyrange * anyrangeanyrange

Calcula a interseção dos intervalos.

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

anyrange - anyrangeanyrange

Calcula a diferença dos intervalos. O segundo intervalo não deve estar contido no primeiro de forma que a diferença não seja um único intervalo.

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

int8range(12,18) - int8range(10,20)empty

int8range(10,20) - int8range(12,18)ERRO: resultado da diferença de range não seria contíguo


Tabela 9.59. Operadores de multi-intervalo

Operador

Descrição

Exemplo(s)

anymultirange @> anymultirangeboolean

O primeiro multi-intervalo contém o segundo multi-intervalo?

'{[2,4)}'::int4multirange @> '{[2,3)}'::int4multiranget

anymultirange @> anyrangeboolean

O multi-intervalo contém o intervalo?

'{[2,4)}'::int4multirange @> int4range(2,3)t

anymultirange @> anyelementboolean

O multi-intervalo contém o elemento?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirangeboolean

O intervalo contém o multi-intervalo?

'[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirangeboolean

O primeiro multi-intervalo está contido no segundo multi-intervalo?

'{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multiranget

anymultirange <@ anyrangeboolean

O multi-intervalo está contido no intervalo?

'{[2,4)}'::int4multirange <@ int4range(1,7)t

anyrange <@ anymultirangeboolean

O intervalo está contido no multi-intervalo?

int4range(2,4) <@ '{[1,7)}'::int4multiranget

anyelement <@ anymultirangeboolean

O elemento está contido no multi-intervalo?

4 <@ '{[1,7)}'::int4multiranget

anymultirange && anymultirangeboolean

Os multi-intervalos se sobrepõem, ou seja, têm algum elemento em comum?

'{[3,7)}'::int8multirange && '{[4,12)}'::int8multiranget

anymultirange && anyrangeboolean

O multi-intervalo se sobrepõe ao intervalo?

'{[3,7)}'::int8multirange && int8range(4,12)t

anyrange && anymultirangeboolean

O intervalo se sobrepõe ao multi-intervalo?

int8range(3,7) && '{[4,12)}'::int8multiranget

anymultirange << anymultirangeboolean

O primeiro multi-intervalo está inteiramente à esquerda do segundo multi-intervalo?

'{[1,10)}'::int8multirange << '{[100,110)}'::int8multiranget

anymultirange << anyrangeboolean

O multi-intervalo está inteiramente à esquerda do intervalo?

'{[1,10)}'::int8multirange << int8range(100,110)t

anyrange << anymultirangeboolean

O intervalo está inteiramente à esquerda do multi-intervalo?

int8range(1,10) << '{[100,110)}'::int8multiranget

anymultirange >> anymultirangeboolean

O primeiro multi-intervalo está inteiramente à direita do segundo multi-intervalo?

'{[50,60)}'::int8multirange >> '{[20,30)}'::int8multiranget

anymultirange >> anyrangeboolean

O multi-intervalo está inteiramente à direita do intervalo?

'{[50,60)}'::int8multirange >> int8range(20,30)t

anyrange >> anymultirangeboolean

O intervalo está inteiramente à direita do multi-intervalo?

int8range(50,60) >> '{[20,30)}'::int8multiranget

anymultirange &< anymultirangeboolean

O primeiro multi-intervalo não se estende à direita do segundo multi-intervalo?

'{[1,20)}'::int8multirange &< '{[18,20)}'::int8multiranget

anymultirange &< anyrangeboolean

O multi-intervalo não se estende à direita do intervalo?

'{[1,20)}'::int8multirange &< int8range(18,20)t

anyrange &< anymultirangeboolean

O intervalo não se estende à direita do multi-intervalo?

int8range(1,20) &< '{[18,20)}'::int8multiranget

anymultirange &> anymultirangeboolean

O primeiro multi-intervalo não se estende à esquerda do segundo multi-intervalo?

'{[7,20)}'::int8multirange &> '{[5,10)}'::int8multiranget

anymultirange &> anyrangeboolean

O multi-intervalo não se estende à esquerda do intervalo?

'{[7,20)}'::int8multirange &> int8range(5,10)t

anyrange &> anymultirangeboolean

O intervalo não se estende à esquerda do multi-intervalo?

int8range(7,20) &> '{[5,10)}'::int8multiranget

anymultirange -|- anymultirangeboolean

Os multi-intervalos são adjacentes?

'{[1.1,2.2)}'::nummultirange -|- '{[2.2,3.3)}'::nummultiranget

anymultirange -|- anyrangeboolean

O multi-intervalo é adjacente ao intervalo?

'{[1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3)t

anyrange -|- anymultirangeboolean

O intervalo é adjacente ao multi-intervalo?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultiranget

anymultirange + anymultirangeanymultirange

Calcula a união dos multi-intervalos. Os multi-intervalos não devem se sobrepor ou serem adjacentes.

'{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange{[5,10), [15,20)}

'{[5,15)}'::nummultirange + '{[15,20)}'::nummultirange{[5,20)}

'{[5,18)}'::nummultirange + '{[15,20)}'::nummultirange{[5,20)}

anymultirange * anymultirangeanymultirange

Calcula a interseção dos multi-intervalos.

'{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange{[10,15)}

anymultirange - anymultirangeanymultirange

Calcula a diferença dos multi-intervalos.

'{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange{[5,10), [15,20)}


Os operadores à esquerda / à direita / adjacente sempre retornam falso quando está envolvido um intervalo, ou multi-intervalo, vazio; ou seja, um intervalo vazio não é considerado estando antes ou depois de qualquer outro intervalo.

Fora isso, os intervalos e multi-intervalos vazios são tratados como a identidade aditiva: qualquer coisa unida ao valor vazio é ela mesma. Qualquer coisa menos o valor vazio é ele mesmo. Um multi-intervalo vazio tem exatamente os mesmos pontos que um intervalo vazio. Todo intervalo contém o intervalo vazio. Todo multi-intervalo contém quantos intervalos vazios se desejar.

Os operadores de união e de diferença de intervalo falham quando o intervalo resultante precisa conter dois subintervalos separados, porque esse intervalo não pode ser representado. Existem operadores separados para união e diferença que recebem parâmetros multi-intervalo e retornam um multi-intervalo, e não falham mesmo que seus argumentos sejam disjuntos. Portanto, se for necessária uma operação de união ou diferença para intervalos que podem ser disjuntos, os erros poderão ser evitados convertendo primeiro os intervalos em multi-intervalos.

A Tabela 9.60 descreve as funções disponíveis para uso com tipos de dados intervalo. A Tabela 9.61 descreve as funções disponíveis para uso com tipos de dados multi-intervalo.

Tabela 9.60. Funções de intervalo

Função

Descrição

Exemplo(s)

lower ( anyrange ) → anyelement

Extrai o limite inferior do intervalo (NULL se o intervalo estiver vazio ou não tiver limite inferior).

lower(numrange(1.1,2.2))1.1

upper ( anyrange ) → anyelement

Extrai o limite superior do intervalo (NULL se o intervalo estiver vazio ou não tiver limite superior).

upper(numrange(1.1,2.2))2.2

isempty ( anyrange ) → boolean

O intervalo está vazio?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

O limite inferior do intervalo é inclusivo?

lower_inc(numrange(1.1,2.2))t

upper_inc ( anyrange ) → boolean

O limite superior do intervalo é inclusivo?

upper_inc(numrange(1.1,2.2))f

lower_inf ( anyrange ) → boolean

O intervalo não possui limite inferior? (Um limite inferior -Infinity retorna falso.)

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

upper_inf ( anyrange ) → boolean

O intervalo não possui limite superior? (Um limite superior Infinity retorna falso.)

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

range_merge ( anyrange, anyrange ) → anyrange

Calcula o menor intervalo que inclui os dois intervalos fornecidos.

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


Tabela 9.61. Funções de multi-intervalo

Função

Descrição

Exemplo(s)

lower ( anymultirange ) → anyelement

Extrai o limite inferior do multi-intervalo (NULL se o multi-intervalo estiver vazio ou não tiver limite inferior).

lower('{[1.1,2.2)}'::nummultirange)1.1

upper ( anymultirange ) → anyelement

Extrai o limite superior do multi-intervalo (NULL se o multi-intervalo estiver vazio ou não tiver limite superior).

upper('{[1.1,2.2)}'::nummultirange)2.2

isempty ( anymultirange ) → boolean

O multi-intervalo está vazio?

isempty('{[1.1,2.2)}'::nummultirange)f

lower_inc ( anymultirange ) → boolean

O limite inferior do multi-intervalo é inclusivo?

lower_inc('{[1.1,2.2)}'::nummultirange)t

upper_inc ( anymultirange ) → boolean

O limite superior do multi-intervalo é inclusivo?

upper_inc('{[1.1,2.2)}'::nummultirange)f

lower_inf ( anymultirange ) → boolean

O multi-intervalo não possui limite inferior? (Um limite inferior -Infinity retorna falso.)

lower_inf('{(,)}'::datemultirange)t

upper_inf ( anymultirange ) → boolean

O multi-intervalo não possui limite superior? (Um limite superior Infinity retorna falso.)

upper_inf('{(,)}'::datemultirange)t

range_merge ( anymultirange ) → anyrange

Calcula o menor intervalo que inclui todo o multi-intervalo.

range_merge('{[1,2), [3,4)}'::int4multirange)[1,4)

multirange ( anyrange ) → anymultirange

Retorna o multi-intervalo contendo apenas o intervalo fornecido.

multirange('[1,2)'::int4range){[1,2)}

unnest ( anymultirange ) → setof anyrange

Expande o multi-intervalo em um conjunto de intervalos.

unnest('{[1,2), [3,4)}'::int4multirange)

 [1,2)
 [3,4)


As funções lower_inc, upper_inc, lower_inf e upper_inf retornam falso para um intervalo ou multi-intervalo vazio.