======================
 范围函数和操作符
======================

.. container:: sect1
   :name: FUNCTIONS-RANGE

   .. container:: titlepage

      .. container::

         .. container::

            .. rubric:: 范围函数和操作符
               :name: 范围函数和操作符
               :class: title

   范围类型的概述请见 `范围类型 <rangetypes.html>`__。

   `表 范围操作符 <functions-range.html#RANGE-OPERATORS-TABLE>`__ 展示了范围类型可用的操作符。

   .. list-table:: 范围操作符
      :widths: 10 10 20 5
      :header-rows: 1
      :class: longtable

      * - 操作符
        - 描述
        - 例子
        - 结果
      * - ``=``
        - 等于
        - ``int4range(1,5) = '[1,4]'::int4range``
        - ``t``
      * - ``<>``
        - 不等于
        - ``numrange(1.1,2.2) <> numrange(1.1,2.3)``
        - ``t``
      * - ``<``
        - 小于
        - ``int4range(1,10) < int4range(2,3)``
        - ``t``
      * - ``>``
        - 大于
        - ``int4range(1,10) > int4range(1,5)``
        - ``t``
      * - ``<=``
        - 小于等于
        - ``numrange(1.1,2.2) <= numrange(1.1,2.2)``
        - ``t``
      * - ``>=``
        - 大于等于
        - ``numrange(1.1,2.2) >= numrange(1.1,2.0)``
        - ``t``
      * - ``@>``
        - 包含范围
        - ``int4range(2,4) @> int4range(2,3)``
        - ``t``
      * - ``@>``
        - 包含元素
        - ``'[2011-01-01,2011-03-01)'::tsrange @>'2011-01-10'::timestamp``
        - ``t``
      * - ``<@``
        - 范围被包含
        - ``int4range(2,4) <@ int4range(1,7)``
        - ``t``
      * - ``<@``
        - 元素被包含
        - ``42 <@ int4range(1,7)``
        - ``f``
      * - ``&&``
        - 重叠(有公共点)
        - ``int8range(3,7) && int8range(4,12)``
        - ``t``
      * - ``<<``
        - 严格左部
        - ``int8range(1,10) << int8range(100,110)``
        - ``t``
      * - ``>>``
        - 严格右部
        - ``int8range(50,60) >> int8range(20,30)``
        - ``t``
      * - ``&<``
        - 不超过右部
        - ``int8range(1,20) &< int8range(18,20)``
        - ``t``
      * - ``&>``
        - 不超过左部
        - ``int8range(7,20) &> int8range(5,10)``
        - ``t``
      * - ``-|-``
        - 相邻
        - ``numrange(1.1,2.2) -|- numrange(2.2,3.3)``
        - ``t``
      * - ``+``
        - 并
        - ``numrange(5,15) + numrange(10,20)``
        - ``[5,20)``
      * - ``*``
        - 交
        - ``int8range(5,15) * int8range(10,20)``
        - ``[10,15)``
      * - ``-``
        - 差
        - ``int8range(5,15) - int8range(10,20)``
        - ``[5,10)``



   简单比较操作符\ ``<``\ 、 ``>``\ 、\ ``<=``\ 和
   ``>=``\ 首先比较下界,并且只有在下界相等时才比较上界。这些比较通常对范围不怎么有用,但是还是提供它们以便能够在范围上构建
   B树索引。

   当涉及一个空范围时,左部/右部/相邻操作符总是返回假;即一个空范围被认为不在任何其他范围前面或者后面。

   如果结果范围可能需要包含两个分离的子范围,并和差操作符将会失败,因为这样的范围无法被表示。

   `表 范围函数 <functions-range.html#RANGE-FUNCTIONS-TABLE>`__\ 显示可用于范围类型的函数。

   .. container:: table
      :name: RANGE-FUNCTIONS-TABLE

      .. list-table:: 范围函数
         :widths: 8 6 8 12 4
         :header-rows: 1
      
         * - 函数
           - 返回类型
           - 描述
           - 例子
           - 结果
         * - ``lower`` ``(anyrange)``
           - 范围的元素类型
           - 范围的下界
           - ``lower`` ``(numrange(1.1, 2.2))``
           - ``1.1``
         * - ``upper`` ``(anyrange)``
           - 范围的元素类型
           - 范围的上界
           - ``upper`` ``(numrange(1.1, 2.2))``
           - ``2.2``
         * - ``isempty`` ``(anyrange)``
           - ``boolean``
           - 范围为空?
           - ``isempty`` ``(numrange(1.1, 2.2))``
           - ``false``
         * - ``lower_inc`` ``(anyrange)``
           - ``boolean``
           - 下界包含在内?
           - ``lower_inc`` ``(numrange(1.1, 2.2))``
           - ``true``
         * - ``upper_inc`` ``(anyrange)``
           - ``boolean``
           - 上界包含在内?
           - ``upper_inc`` ``(numrange(1.1, 2.2))``
           - ``false``
         * - ``lower_inf`` ``(anyrange)``
           - ``boolean``
           - 下界无限?
           - ``lower_inf`` ``('(,)'::daterange)``
           - ``true``
         * - ``upper_inf`` ``(anyrange)``
           - ``boolean``
           - 上界无限?
           - ``upper_inf`` ``('(,)'::daterange)``
           - ``true``
         * - ``range_merge`` ``(anyrange, anyrange)``
           - ``anyrange``
           - 包含两个给定范围的最小范围
           - ``range_merge`` ``('[1,2)'::int4range, '[3,4)'::int4range)``
           - ``[1,4)``


   如果范围为空或者被请求的界是无限的,\ ``lower``\ 和\ ``upper``\ 函数返回空值。函数\ ``lower_inc``\ 、\ ``upper_inc``\ 、\ ``lower_inf``\ 和\ ``upper_inf``\ 对一个空范围全部返回假。