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 “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
    

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 %<=.

  • ¿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
    

Comparaciones temporal

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