Comparaciones

Comparaciones tradicionales

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
    

Comparaciones alguna vez y siempre

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
    

Comparaciones temporales

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)}