5.7. Operadores de comparación

5.7.1. Operadores de comparación 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 Sección 2.1.5), después los cuadros delimitadores (ver la Sección 4.8) 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 y conjunto de instantes, 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@2012-01-01, 1@2012-01-04)' = tint '[2@2012-01-03, 2@2012-01-05)';
    -- false
    
  • ¿Son diferentes los valores temporales?

    ttype <> ttype: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-04)' <> tint '[2@2012-01-03, 2@2012-01-05)'
    -- true
    
  • ¿Es el primer valor temporal menor que el segundo?

    ttype < ttype: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-04)' < tint '[2@2012-01-03, 2@2012-01-05)'
    -- true
    
  • ¿Es el primer valor temporal mayor que el segundo?

    ttype > ttype: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-04)' > tint '[2@2012-01-03, 2@2012-01-05)'
    -- false
    
  • ¿Es el primer valor temporal menor o igual que el segundo?

    ttype <= ttype: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-04)' <= tint '[2@2012-01-03, 2@2012-01-05)'
    -- true
    
  • ¿Es el primer valor temporal mayor o igual que el segundo?

    ttype >= ttype: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-04)' >= tint '[2@2012-01-03, 2@2012-01-05)'
    -- false
    

5.7.2. Operadores de comparación 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 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/siempre están disponibles para todos los tipos temporales, mientras que las desigualdades alguna vez/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 igual al valor?

    ttype ?= base: boolean

    La función no tiene en cuenta si los límites son inclusivos o no.

    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' ?= 2;
    -- true
    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' ?= 3;
    -- true
    SELECT tgeompoint '[Point(0 0)@2012-01-01, Point(2 2)@2012-01-04)' ?=
      geometry 'Point(1 1)';
    -- true
    
  • ¿Es el valor temporal alguna vez diferente del valor?

    ttype ?<> base: boolean

    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' ?<> 2;
    -- false
    SELECT tfloat '[2@2012-01-01, 2@2012-01-04)' ?<> 2;
    -- true
    SELECT tgeompoint '[Point(1 1)@2012-01-01, Point(1 1)@2012-01-04)' ?<>
      geometry 'Point(1 1)';
    -- true
    
  • ¿Es el valor temporal alguna vez menor que el valor?

    tnumber ?< number: boolean

    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' ?< 2;
    -- "{[t@2012-01-01, f@2012-01-02, f@2012-01-04)}"
    SELECT tint '[2@2012-01-01, 2@2012-01-05)' ?< tfloat '[1@2012-01-03, 3@2012-01-05)';
    -- "{[f@2012-01-03, f@2012-01-04], (t@2012-01-04, t@2012-01-05)}"
    
  • ¿Es el valor temporal alguna vez mayor que el valor?

    tnumber ?> number: boolean

    SELECT tint '[1@2012-01-03, 1@2012-01-05)' ?> 1;
    -- "[f@2012-01-03, f@2012-01-05)"
    
  • ¿Es el valor temporal alguna vez menor o igual que el valor?

    tnumber ?<= number: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-05)' ?<= tfloat '{2@2012-01-03, 3@2012-01-04}';
    -- "{t@2012-01-03, t@2012-01-04}"
    
  • ¿Es el valor temporal alguna vez mayor o igual que el valor?

    tnumber ?>= number: boolean

    SELECT 'AAA'::text ?> ttext '{[AAA@2012-01-01, AAA@2012-01-03),
      [BBB@2012-01-04, BBB@2012-01-05)}';
    -- "{[f@2012-01-01, f@2012-01-03), [t@2012-01-04, t@2012-01-05)}"
    
  • ¿Es el valor temporal siempre igual que el valor?

    ttype %= base: boolean

    La función no tiene en cuenta si los límites son inclusivos o no.

    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' %= 2;
    -- true
    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' %= 3;
    -- true
    SELECT tgeompoint '[Point(0 0)@2012-01-01, Point(2 2)@2012-01-04)' %=
      geometry 'Point(1 1)';
    -- true
    
  • ¿Es el valor temporal siempre diferente que el valor?

    ttype %<> base: boolean

    SELECT tfloat '[1@2012-01-01, 3@2012-01-04)' %<> 2;
    -- false
    SELECT tfloat '[2@2012-01-01, 2@2012-01-04)' %<> 2;
    -- true
    SELECT tgeompoint '[Point(1 1)@2012-01-01, Point(1 1)@2012-01-04)' %<>
      geometry 'Point(1 1)';
    -- true
    
  • ¿Es el valor temporal siempre menor que el valor?

    tnumber %< number: boolean

    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' %< 2;
    -- "{[t@2012-01-01, f@2012-01-02, f@2012-01-04)}"
    SELECT tint '[2@2012-01-01, 2@2012-01-05)' %< tfloat '[1@2012-01-03, 3@2012-01-05)';
    -- "{[f@2012-01-03, f@2012-01-04], (t@2012-01-04, t@2012-01-05)}"
    
  • ¿Es el valor temporal siempre mayor que el valor?

    tnumber %> number: boolean

    SELECT tint '[1@2012-01-03, 1@2012-01-05)' %> 1;
    -- "[f@2012-01-03, f@2012-01-05)"
    
  • ¿Es el valor temporal siempre menor o igual que el valor?

    tnumber %<= number: boolean

    SELECT tint '[1@2012-01-01, 1@2012-01-05)' %<= tfloat '{2@2012-01-03, 3@2012-01-04}';
    -- "{t@2012-01-03, t@2012-01-04}"
    
  • ¿Es el valor temporal siempre mayor o igual que el valor?

    tnumber %>= number: boolean

    SELEC	T 'AAA'::text %> ttext '{[AAA@2012-01-01, AAA@2012-01-03),
      [BBB@2012-01-04, BBB@2012-01-05)}';
    -- "{[f@2012-01-01, f@2012-01-03), [t@2012-01-04, t@2012-01-05)}"
    

5.7.3. Operadores de comparación 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@2012-01-01, 2@2012-01-04)' #= 3;
    -- "{[f@2012-01-01, f@2012-01-04)}"
    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' #= tint '[1@2012-01-01, 1@2012-01-04)';
    -- "{[t@2012-01-01], (f@2012-01-01, f@2012-01-04)}"
    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' #= tfloat '[4@2012-01-02, 1@2012-01-05)';
    -- "{[f@2012-01-02, t@2012-01-03], (f@2012-01-03, f@2012-01-04)}"
    SELECT tgeompoint '[Point(0 0)@2012-01-01, Point(2 2)@2012-01-03)' #=
      geometry 'Point(1 1)';
    -- "{[f@2012-01-01, t@2012-01-02], (f@2012-01-02, f@2012-01-03)}"
    SELECT tgeompoint '[Point(0 0)@2012-01-01, Point(2 2)@2012-01-03)' #=
      tgeompoint '[Point(0 2)@2012-01-01, Point(2 0)@2012-01-03)';
    -- "{[f@2012-01-01], (t@2012-01-01, t@2012-01-03)}"
    
  • Diferente temporal

    {base,ttype} #<> {base,ttype}: tbool

    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' #<> 2;
    -- "{[t@2012-01-01, f@2012-01-02], (t@2012-01-02, 2012-01-04)}"
    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' #<> tint '[2@2012-01-02, 2@2012-01-05)';
    -- "{[f@2012-01-02], (t@2012-01-02, t@2012-01-04)}"
    
  • Menor que temporal

    {base,torder} #< {base,torder}: tbool

    SELECT tfloat '[1@2012-01-01, 4@2012-01-04)' #< 2;
    -- "{[t@2012-01-01, f@2012-01-02, f@2012-01-04)}"
    SELECT tint '[2@2012-01-01, 2@2012-01-05)' #< tfloat '[1@2012-01-03, 3@2012-01-05)';
    -- "{[f@2012-01-03, f@2012-01-04], (t@2012-01-04, t@2012-01-05)}"
    
  • Mayor que temporal

    {base,torder} #> {base,torder}: tbool

    SELECT 1 #> tint '[1@2012-01-03, 1@2012-01-05)';
    -- "[f@2012-01-03, f@2012-01-05)"
    
  • Menor o igual que temporal

    {base,torder} #<= {base,torder}: tbool

    SELECT tint '[1@2012-01-01, 1@2012-01-05)' #<= tfloat '{2@2012-01-03, 3@2012-01-04}';
    -- "{t@2012-01-03, t@2012-01-04}"
    
  • Mayor o igual que temporal

    {base,torder} #>= {base,torder}: tbool

    SELECT 'AAA'::text #> ttext '{[AAA@2012-01-01, AAA@2012-01-03),
      [BBB@2012-01-04, BBB@2012-01-05)}';
    -- "{[f@2012-01-01, f@2012-01-03), [t@2012-01-04, t@2012-01-05)}"