
# 范围操作符
范围操作符用于处理范围类型数据的运算（如 @\>、\&\&）。范围操作符支持直接应用于查询表达式，快速筛选特定区间内的数据，常用于范围比较、查询限制及区间界定。
![](https://support.huaweicloud.com/sqlreference-911-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) ```                                                                                                                                                                                                           |
   
