Operaciones de cuadro delimitador

Operaciones topológicas

A continuación se presentan los operadores topológicos disponibles para los tipos de conjunto y de rango.

  • ¿Se superponen los valores (tienen valores en común)?

    {set,spans} && {set,spans} → boolean

    SELECT intset '{1, 3}' && intset '{2, 3, 4}';
    -- true
    SELECT floatspan '[1, 3)' && floatspan '[3, 4)';
    -- false
    SELECT floatspanset '{[1, 5),[6, 8)}' && floatspan '[1, 6)';
    -- true
    SELECT tstzspan '[2001-01-01, 2001-01-05)' && tstzspan '[2001-01-02, 2001-01-07)';
    -- true
    
  • ¿Contiene el primer valor el segundo?

    {set,spans} @> {base,set,span} → boolean

    SELECT floatset '{1.5, 2.5}' @> 2.5;
    -- true
    SELECT tstzspan '[2001-01-01, 2001-05-01)' @> timestamptz '2001-02-01';
    -- true
    SELECT floatspanset '{[1, 2),(2, 3)}' @> 2.0;
    -- false
    
  • ¿Está el primer valor contenido en el segundo?

    {base,set,spans} <@ {set,spans} → boolean

    SELECT timestamptz '2001-01-10' <@ tstzspan '[2001-01-01, 2001-05-01)';
    -- true
    SELECT floatspan '[2, 5]' <@ floatspan '[1, 5)';
    -- false
    SELECT floatspanset '{[1,2],[3,4]}' <@ floatspan '[1, 6]';
    -- true
    SELECT tstzspan '[2001-02-01, 2001-03-01)' <@ tstzspan '[2001-01-01, 2001-05-01)';
    -- true
    
  • ¿Es el primer valor adyacente al segundo?

    spans -|- spans → boolean

    SELECT intspan '[2, 6)' -|- intspan '[6, 7)';
    -- true
    SELECT floatspan '[2, 5)' -|- floatspan '(5, 6)';
    -- false
    SELECT floatspanset '{[2, 3],[4, 5)}' -|- floatspan '(5, 6)';
    -- true
    SELECT tstzspan '[2001-01-01, 2001-01-05)' -|- tstzset '{2001-01-05, 2001-01-07}';
    -- true
    SELECT tstzspanset '{[2001-01-01, 2001-01-02]}' -|- tstzspan '[2001-01-02, 2001-01-03)';
    -- false
    

Operaciones de posición

Los operadores de posición disponibles para los tipos de conjunto y de rango se dan a continuación. Observe que los operadores para tipos de tiempo tienen un # adicional para distinguirlos de los operadores para tipos de números.

  • ¿Está el primer valor estrictamente a la izquierda del segundo?

    numbers << numbers → boolean

    times <<# times → boolean

    SELECT intspan '[15, 20)' << 20;
    -- true
    SELECT intspanset '{[15, 17],[18, 20)}' << 20;
    -- true
    SELECT floatspan '[15, 20)' << floatspan '(15, 20)';
    -- false
    SELECT dateset '{2001-01-01, 2001-01-02}' <<# dateset '{2001-01-03, 2001-01-05}';
    -- true
    
  • ¿Está el primer valor estrictamente a la derecha del segundo?

    numbers >> numbers → boolean

    times #>> times → boolean

    SELECT intspan '[15, 20)' >> 10;
    -- true
    SELECT floatspan '[15, 20)' >> floatspan '[5, 10]';
    -- true
    SELECT floatspanset '{[15, 17], [18, 20)}' >> floatspan '[5, 10]';
    -- true
    SELECT tstzspan '[2001-01-04, 2001-01-05)' #>>
      tstzspanset '{[2001-01-01, 2001-01-04), [2001-01-05, 2001-01-06)}';
    -- true
    
  • ¿No está el primer valor a la derecha del segundo?

    numbers &< numbers → boolean

    times &<# times → boolean

    SELECT intspan '[15, 20)' &< 18;
    -- false
    SELECT intspanset '{[15, 16],[17, 18)}' &< 18;
    -- true
    SELECT floatspan '[15, 20)' &< floatspan '[10, 20]';
    -- true
    SELECT dateset '{2001-01-02, 2001-01-05}' &<# dateset '{2001-01-01, 2001-01-04}';
    -- false
    
  • ¿No está el primer valor a la izquierda del segundo?

    numbers &> numbers → boolean

    times #&> times → boolean

    SELECT intspan '[15, 20)' &> 30;
    -- true
    SELECT floatspan '[1, 6]' &> floatspan '(1, 3)';
    -- false
    SELECT floatspanset '{[1, 2],[3, 4]}' &> floatspan '(1, 3)';
    -- false
    SELECT timestamp '2001-01-01' #&> tstzspan '[2001-01-01, 2001-01-05)';
    -- true
    

Operaciones de división

Al crear índices para tipos de conjuntos o conjunto de rangos, lo que se almacena en el índice no es el valor real, sino un cuadro delimitador que representa el valor. En este caso, el índice proporcionará una lista de valores candidatos que pueden satisfacer el predicado de la consulta, y se necesita un segundo paso para filtrar los valores candidatos calculando el predicado de la consulta sobre los valores reales.

Sin embargo, cuando los cuadros delimitadores tienen un gran espacio vacío no cubierto por los valores reales, el índice generará muchos valores candidatos que no satisfacen el predicado de la consulta, lo que reduce la eficiencia del índice. En estas situaciones, puede ser mejor representar un valor no con un cuadro delimitador único, sino con múltiples cuadros delimitadores. Esto aumenta considerablemente la eficiencia del índice, siempre que el índice sea capaz de gestionar múltiples cuadros delimitadores por valor. Las siguientes funciones se utilizan para generar múltiples rangos a partir de un único valor de conjunto o conjunto de rangos.

  • Devuelve una matriz de N rangos obtenida fusionando los elementos de un conjunto o los rangos de un conjunto de rangos

    splitNSpans(set, integer) → span[]

    splitNSpans(spanset, integer) → span[]

    El último argumento especifica el número de rangos de salida. Si el número de elementos o rangos de entrada es menor que el número especificado, la matriz resultante tendrá un rango por elemento o rango de entrada. De lo contrario, el número especificado de rangos de salida se obtendrá fusionando elementos o rangos de entrada consecutivos.

    SELECT splitNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 1);
    /* {"[1, 11)"} */
    SELECT splitNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 3);
    -- {"[1, 5)","[5, 8)","[8, 11)"}
    SELECT splitNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 6);
    -- {"[1, 3)","[3, 5)","[5, 7)","[7, 9)","[9, 10)","[10, 11)"}
    SELECT splitNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 12);
    /* {"[1, 2)","[2, 3)","[3, 4)","[4, 5)","[5, 6)","[6, 7)","[7, 8)","[8, 9)",
        "[9, 10)","[10, 11)"} */
    
    SELECT splitNSpans(intspanset '{[1, 2), [3, 4), [5, 6), [7, 8), [9, 10)}');
    -- {"[1, 2)","[3, 4)","[5, 6)","[7, 8)","[9, 10)"}
    SELECT splitNSpans(floatspanset '{[1, 2), [3, 4), [5, 6), [7, 8), [9, 10)}', 3);
    -- {"[1, 4)","[5, 8)","[9, 10)"}
    SELECT splitNSpans(datespanset '{[2000-01-01, 2000-01-04), [2000-01-05, 2000-01-10)}', 3);
    -- {"[2000-01-01, 2000-01-04)","[2000-01-05, 2000-01-10)"}
    
  • Devuelve una matriz de rangos obtenida fusionando N elementos consecutivos de un conjunto o N rangos consecutivos de un conjunto de rangos

    splitEachNSpans(set, integer) → span[]

    splitEachNSpans(spanset, integer) → span[]

    El último argumento especifica el número de elementos de entrada que se fusionan para producir un rango de salida. Si la cantidad de elementos de entrada es menor que el número especificado, la matriz resultante tendrá un rango de salida por elemento. De lo contrario, la cantidad especificada de elementos de entrada consecutivos se fusionará en un único rango de salida en la respuesta. Observe que, a diferencia de la función splitNSpans, el número de rangos en el resultado depende del número de elementos o de rangos de entrada.

    SELECT splitEachNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 1);
    /* {"[1, 2)","[2, 3)","[3, 4)","[4, 5)","[5, 6)","[6, 7)","[7, 8)","[8, 9)",
        "[9, 10)","[10, 11)"} */
    SELECT splitEachNSpans(intspanset '{[1, 2), [3, 4), [5, 6), [7, 8), [9, 10)}', 3);
    -- {"[1, 6)","[7, 10)"}
    SELECT splitEachNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 6);
    -- {"[1, 7)","[7, 11)"}
    SELECT splitEachNSpans(intset '{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}', 12);
    -- {"[1, 11)"}