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 the section called “Comparaciones”), después los cuadros delimitadores (ver la the section called “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
Comparaciones tradicionales
ttype {=, <>, <, >, <=, >=} ttype → boolean
SELECT tint '[1@2001-01-01, 1@2001-01-04)' = tint '[2@2001-01-03, 2@2001-01-05)'; -- false SELECT tint '[1@2001-01-01, 1@2001-01-04)' <> tint '[2@2001-01-03, 2@2001-01-05)'; -- true SELECT tint '[1@2001-01-01, 1@2001-01-04)' < tint '[2@2001-01-03, 2@2001-01-05)'; -- true SELECT tint '[1@2001-01-01, 1@2001-01-04)' > tint '[2@2001-01-03, 2@2001-01-05)'; -- false SELECT tint '[1@2001-01-01, 1@2001-01-04)' <= tint '[2@2001-01-03, 2@2001-01-05)'; -- true 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 %<=
.
Comparaciones alguna vez y siempre
{base,ttype} {?=, ?<>, ?<, ?>, ?<=, ?>=} {base,ttype} → boolean
{base,ttype} {%=, %<>, %<, %>, %<=, %>=} {base,ttype} → boolean
Los operadores no tienen en cuenta si los límites son inclusivos o no.
SELECT tint '[1@2001-01-01, 3@2001-01-04]' ?= 2; -- false SELECT tgeometry '[Point(0 0)@2001-01-01, Linestring(0 0,1 1)@2001-01-04]' ?= geometry 'Linestring(1 1,0 0)'; -- true SELECT tfloat '[1@2001-01-01, 1@2001-01-04)' %= 1; -- true SELECT tgeometry '[Linestring(0 0,1 1)@2001-01-01, Linestring(1 1,0 0)@2001-01-04)' %= geometry 'Linestring(0 0,1 1)'; -- true
SELECT tfloat '[1@2001-01-01, 3@2001-01-04)' ?<> 2; -- true 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 tgeogpoint '[Point(1 1)@2001-01-01, Point(1 1)@2001-01-04)' %<> geography 'Point(2 2)'; -- true
SELECT tint '[1@2001-01-01, 4@2001-01-04]' ?< 2; -- true SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' %< 2; -- false
SELECT tint '[1@2001-01-03, 1@2001-01-05]' ?> 0; -- true SELECT tfloat '[1@2001-01-03, 1@2001-01-05)' %> 1; -- false
SELECT tint '[1@2001-01-01, 1@2001-01-05]' ?<= 2; -- true SELECT tfloat '[1@2001-01-01, 1@2001-01-05)' %<= 4; -- true
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
.
Comparaciones temporales
{base,ttype} {#=, #<>, #<, #>, #<=, #>=} {base,ttype} → boolean
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 '[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 tgeometry '[Point(0 0)@2001-01-01, Linestring(1 1,2 2)@2001-01-03]' #= geometry 'Linestring(2 2,1 1)'; -- {[f@2001-01-01, t@2001-01-03]}
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)} SELECT tgeometry '[Point(0 0)@2001-01-01, Linestring(1 1,2 2)@2001-01-03]' #<> geometry 'Linestring(2 2,1 1)'; -- {[t@2001-01-01, f@2001-01-03]}
SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' #< 2; -- {[t@2001-01-01, f@2001-01-02, f@2001-01-04)} SELECT 1 #> tint '[1@2001-01-03, 1@2001-01-05)'; -- [f@2001-01-03, f@2001-01-05) 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} 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)}