Los operadores de comparación tradicionales (=
, <
, etc.) requieren que los operandos izquierdo y derecho sean del mismo tipo base. Excepto la igualdad y la no igualdad, los otros operadores de comparación no son útiles en el mundo real pero permiten que los índices de árbol B se construyan sobre tipos temporales. Estos operadores comparan los períodos delimitadores (ver la “Comparaciones”), después los cuadros delimitadores (ver la “Comparaciones”) y si son iguales, entonces la comparación depende del subtipo. Para los valores de instante, primero comparan las marcas de tiempo y, si son iguales, comparan los valores. Para los valores de secuencia, comparan los primeros N instantes, donde N es el mínimo del número de instantes que componen ambos valores. Finalmente, para los valores de conjuntos de secuencias, comparan los primeros N valores de secuencia, donde N es el mínimo del número de secuencias que componen ambos valores.
Los operadores de igualdad y no igualdad consideran la representación equivalente para diferentes subtipos como se muestra a continuación.
SELECT tint '1@2001-01-01' = tint '{1@2001-01-01}'; -- true SELECT tfloat '1.5@2001-01-01' = tfloat '[1.5@2001-01-01]'; -- true SELECT ttext 'AAA@2001-01-01' = ttext '{[AAA@2001-01-01]}'; -- true SELECT tgeompoint '{Point(1 1)@2001-01-01, Point(2 2)@2001-01-02}' = tgeompoint '{[Point(1 1)@2001-01-01], [Point(2 2)@2001-01-02]}'; -- true SELECT tgeogpoint '[Point(1 1 1)@2001-01-01, Point(2 2 2)@2001-01-02]' = tgeogpoint '{[Point(1 1 1)@2001-01-01], [Point(2 2 2)@2001-01-02]}'; -- true
¿Son iguales los valores temporales?
ttype = ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' = tint '[2@2001-01-03, 2@2001-01-05)'; -- false
¿Son diferentes los valores temporales?
ttype <> ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' <> tint '[2@2001-01-03, 2@2001-01-05)'; -- true
¿Es el primer valor temporal menor que el segundo?
ttype < ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' < tint '[2@2001-01-03, 2@2001-01-05)'; -- true
¿Es el primer valor temporal mayor que el segundo?
ttype > ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' > tint '[2@2001-01-03, 2@2001-01-05)'; -- false
¿Es el primer valor temporal menor o igual que el segundo?
ttype <= ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' <= tint '[2@2001-01-03, 2@2001-01-05)'; -- true
¿Es el primer valor temporal mayor o igual que el segundo?
ttype >= ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' >= tint '[2@2001-01-03, 2@2001-01-05)'; -- false
Una posible generalización de los operadores de comparación tradicionales (=
, <>
, <
, <=
, etc.) a tipos temporales consiste en determinar si la comparación es alguna vez o siempre verdadera. En este caso, el resultado es un valor booleano. MobilityDB proporciona operadores para probar si la comparación de un valor temporal y un valor del tipo base or dos valores temporales es alguna vez o siempre verdadera. Estos operadores se indican anteponiendo los operadores de comparación tradicionales con, respectivamente, ?
(alguna vez) y %
(siempre). Algunos ejemplos son ?=
, %<>
o ?<=
. La igualdad y la no igualdad alguna vez o siempre están disponibles para todos los tipos temporales, mientras que las desigualdades alguna vez o siempre sólo están disponibles para los tipos temporales cuyo tipo base tiene un orden total definido, es decir, tint
, tfloat
o ttext
. Las comparaciones alguna vez y siempre son operadores inversos: por ejemplo, ?=
es el inverso de %<>
y ?>
es el inverso de %<=
.
¿Es el valor temporal alguna vez o siempre igual al valor?
{base,ttype} ?= {base,ttype} → boolean
{base,ttype} %= {base,ttype} → boolean
La función no tiene en cuenta si los límites son inclusivos o no.
SELECT tint '[1@2001-01-01, 3@2001-01-04]' ?= 2; -- false SELECT tfloat '[1@2001-01-01, 3@2001-01-04)' ?= 2; -- true SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(2 2)@2001-01-04]' ?= geometry 'Point(2 2)'; -- true SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(2 2)@2001-01-04)' ?= geometry 'Point(2 2)'; -- false
SELECT tfloat '[1@2001-01-01, 1@2001-01-04)' %= 1; -- true SELECT tfloat '[1@2001-01-01, 3@2001-01-04)' %= 2; -- false SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(2 2)@2001-01-04)' %= geometry 'Point(1 1)'; -- false
¿Es el valor temporal alguna/siempre vez diferente del valor?
{base,ttype} ?<> {base,ttype} → boolean
{base,ttype} %<> {base,ttype} → boolean
SELECT tfloat '[1@2001-01-01, 3@2001-01-04)' ?<> 2; -- true SELECT tfloat '[2@2001-01-01, 2@2001-01-04)' ?<> 2; -- false SELECT tgeompoint '[Point(1 1)@2001-01-01, Point(1 1)@2001-01-04)' ?<> geometry 'Point(1 1)'; -- false
SELECT tfloat '[1@2001-01-01, 3@2001-01-04)' %<> 2; -- false SELECT tfloat '[2@2001-01-01, 2@2001-01-04)' %<> 3; -- true SELECT tgeogpoint '[Point(1 1)@2001-01-01, Point(1 1)@2001-01-04)' %<> geography 'Point(2 2)'; -- true
¿Es el valor temporal alguna vez o siempre menor que el valor?
{base,torder} ?< {base,torder} → boolean
{base,torder} %< {base,torder} → boolean
SELECT tint '[1@2001-01-01, 4@2001-01-04]' ?< 2; -- true
SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' %< 2; -- false
¿Es el valor temporal alguna vez mayor que el valor?
{base,torder} ?> {base,torder} → boolean
{base,torder} %> {base,torder} → boolean
SELECT tint '[1@2001-01-03, 1@2001-01-05]' ?> 0; -- true
SELECT tfloat '[1@2001-01-03, 1@2001-01-05)' %> 1; -- false
¿Es el valor temporal alguna vez o siempre menor o igual que el valor?
{base,torder} ?<= {base,torder} → boolean
{base,torder} %<= {base,torder} → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-05]' ?<= 2; -- true
SELECT tfloat '[1@2001-01-01, 1@2001-01-05)' %<= 4; -- true
¿Es el valor temporal alguna vez o siempre mayor o igual que el valor?
{base,torder} ?>= {base,torder} → boolean
{base,torder} %>= {base,torder} → boolean
SELECT ttext '{[AAA@2001-01-01, AAA@2001-01-03), [BBB@2001-01-04, BBB@2001-01-05)}' ?> 'AAA'::text; -- true
SELECT ttext '{[AAA@2001-01-01, AAA@2001-01-03), [BBB@2001-01-04, BBB@2001-01-05)}' %> 'AAA'::text; -- false
Otra posible generalización de los operadores de comparación tradicionales (=
, <>
, <
, <=
, etc.) a tipos temporales consiste en determinar si la comparación es verdadera o falsa en cada instante. En este caso, el resultado es un booleano temporal. Los operadores de comparación temporal se indican anteponiendo los operadores de comparación tradicionales con #
. Algunos ejemplos son #=
o #<=
. La igualdad y no igualdad temporal están disponibles para todos los tipos temporales, mientras que las desigualdades temporales sólo están disponibles para los tipos temporales cuyo tipo base tiene un orden total definido, es decir, tint
, tfloat
o ttext
.
Igual temporal
{base,ttype} #= {base,ttype} → tbool
SELECT tfloat '[1@2001-01-01, 2@2001-01-04)' #= 3; -- {[f@2001-01-01, f@2001-01-04)} SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #= tfloat '[1@2001-01-01, 1@2001-01-04)'; -- {[t@2001-01-01], (f@2001-01-01, f@2001-01-04)} SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #= tfloat '[4@2001-01-02, 1@2001-01-05)'; -- {[f@2001-01-02, t@2001-01-03], (f@2001-01-03, f@2001-01-04)} SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(2 2)@2001-01-03)' #= geometry 'Point(1 1)'; -- {[f@2001-01-01, t@2001-01-02], (f@2001-01-02, f@2001-01-03)} SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(2 2)@2001-01-03)' #= tgeompoint '{[Point(0 2)@2001-01-01], (Point(0 0)@2001-01-01, Point(2 2)@2001-01-03)}'; -- {[f@2001-01-01], (t@2001-01-01, t@2001-01-03)}
Diferente temporal
{base,ttype} #<> {base,ttype} → tbool
SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #<> 2; -- {[t@2001-01-01, f@2001-01-02], (t@2001-01-02, 2001-01-04)} SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #<> tfloat '[2@2001-01-02, 2@2001-01-05)'; -- {[f@2001-01-02], (t@2001-01-02, t@2001-01-04)}
Menor que temporal
{base,torder} #< {base,torder} → tbool
SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #< 2; -- {[t@2001-01-01, f@2001-01-02, f@2001-01-04)} SELECT tfloat '[2@2001-01-01, 2@2001-01-05)' #< tfloat '[1@2001-01-03, 3@2001-01-05)'; -- {[f@2001-01-03, f@2001-01-04], (t@2001-01-04, t@2001-01-05)}
Mayor que temporal
{base,torder} #> {base,torder} → tbool
SELECT 1 #> tint '[1@2001-01-03, 1@2001-01-05)'; -- [f@2001-01-03, f@2001-01-05)
Menor o igual que temporal
{base,torder} #<= {base,torder} → tbool
SELECT tfloat '[1@2001-01-01, 1@2001-01-05)' #<= tfloat '{2@2001-01-03, 3@2001-01-04}'; -- {t@2001-01-03, t@2001-01-04}
Mayor o igual que temporal
{base,torder} #>= {base,torder} → tbool
SELECT 'AAA'::text #> ttext '{[AAA@2001-01-01, AAA@2001-01-03), [BBB@2001-01-04, BBB@2001-01-05)}'; -- {[f@2001-01-01, f@2001-01-03), [t@2001-01-04, t@2001-01-05)}