# 范围操作符
范围操作符用于处理范围类型数据的运算（如 @\>、\&\&）。范围操作符支持直接应用于查询表达式，快速筛选特定区间内的数据，常用于范围比较、查询限制及区间界定。
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
- 比较操作符\<、\>、\<=和\>=先比较下界，只有下界相等时才比较上界。
- \<\<、\>\>和-\|-操作符当包含空范围时也会返回false，即不认为空范围在其他范围之前或之后。
- 并集和差集操作符的执行结果无法包含两个不相交的子范围。
 
| 操作符 | 描述                        | 用法示例                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| =                       | 等于                       | 比较两个范围是否相等，返回t，表示相等。 ``` SELECT int4range(1,5) = '[1,4]'::int4range AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                                         |
| \<\>                   | 不等于                         | 比较两个范围是否不相等，返回t，表示不相等。 ``` SELECT numrange(1.1,2.2) <> numrange(1.1,2.3) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                   |
| \<                       | 小于                        | 比较(1,10)是否小于(2,3)，先比较下界，且只有在下界相等时才比较上界。 ``` SELECT int4range(1,10) < int4range(2,3) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                       |
| \>                    | 大于                         | 比较(1,10)是否大于(1,5)，先比较下界，且只有在下界相等时才比较上界。 ``` SELECT int4range(1,10) > int4range(1,5) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                     |
| \<=                  | 小于或等于                      | 比较(1.1,2.2) 是否小于或等于(1.1,2.2)。 ``` SELECT numrange(1.1,2.2) <= numrange(1.1,2.2) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                             |
| \>=                    | 大于或等于                     | 比较(1.1,2.2) 是否大于等于(1.1,2.0)，先比较下界，且只有在下界相等时才比较上界。 ``` SELECT numrange(1.1,2.2) >= numrange(1.1,2.0) AS RESULT; result -------- t (1 row) ```                                                                                                                                                           |
| @\>                    | 包含范围、包含元素                   | (2,4)是否包含(2,3)，返回t，表示包含。 ``` SELECT int4range(2,4) @> int4range(2,3) AS RESULT; result -------- t (1 row) ``` \[2011-01-01,2011-03-01)是否包含2011-01-10，返回t，表示包含。 ``` SELECT '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp AS RESULT; result -------- t (1 row) ``` |
| \<@                      | 范围包含于、元素包含于               | (2,4)是否包含于(1,7)，返回t，表示包含。 ``` SELECT int4range(2,4) <@ int4range(1,7) AS RESULT; result -------- t (1 row) ``` 元素42是否包含于(1,7)，返回f，表示不包含。 ``` SELECT 42 <@ int4range(1,7) AS RESULT; result -------- f (1 row) ```                                    |
| \&\&                   | 重叠（有共同点）                   | 判断(3,7)和(4,12)的范围是否重叠，返回t，表示存在重叠部分。 ``` SELECT int8range(3,7) && int8range(4,12) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                         |
| \<\<                   | 范围值是否比另一个范围值的最小值还小（没有交集） | 判断左边的范围值是否比右边范围值的最小值还小，且两者没有交集。 ``` SELECT int8range(1,10) << int8range(100,110) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                            |
| \>\>                   | 范围值是否比另一个范围值的最大值还大（没有交集）    | 判断左边的范围值是否比右边范围值的最大值还大，且两者没有交集。 ``` SELECT int8range(50,60) >> int8range(20,30) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                               |
| \&\<                   | 不超过右边范围上界。                | 判断左边的范围值是否不超过右边范围值的上界。 ``` SELECT int8range(1,20) &< int8range(18,20) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                                       |
| \&\>                   | 不超过左边范围上界。                   | 判断右边的范围值是否不超过左边范围值的上界。 ``` SELECT int8range(7,20) &> int8range(5,10) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                                                   |
| -\|-                   | 相邻                       | 判断范围是否相邻，返回t，表示相邻。 ``` SELECT numrange(1.1,2.2) -|- numrange(2.2,3.3) AS RESULT; result -------- t (1 row) ```                                                                                                                                                                                         |
| +                      | 并集                        | 计算两个区间的并集，结果返回新的区间\[5,20)。 ``` SELECT numrange(5,15) + numrange(10,20) AS RESULT; result -------- [5,20) (1 row) ```                                                                                                                                                                                                               |
| \*                     | 交集                       | 计算两个区间的交集，结果返回新的区间\[10,15)。 ``` SELECT int8range(5,15) * int8range(10,20) AS RESULT; result --------- [10,15) (1 row) ```                                                                                                                                                                                                          |
| -                       | 差集                        | 计算两个区间的差集，结果返回新的区间 \[5,10)。 ``` SELECT int8range(5,15) - int8range(10,20) AS RESULT; result -------- [5,10) (1 row) ```                                                                                                                                                                              |
   
