# Roaring Bitmap操作符
8.1.3集群版本开始，DWS支持高效的位图处理操作符，位图操作符在数据库中用于高效地进行集合运算，如交集、并集、差集和异或，通过合理使用位图操作符，可以显著提升数据库的处理效率，满足各种复杂的数据处理需求。适用于需要频繁进行集合运算的场景，如数据挖掘、机器学习中的特征工程，以及需要快速数据筛选和聚合的场景。
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/caution_3.0-zh-cn.png)
- 9.1.1.100集群版本开始支持64位整数的位图。
- 9.1.1.100集群版本中的\|、-、@\>、\<@位图操作符，使用bigint作为输入时，不支持使用nvarchar2类型直接作为bigint输入，需要使用::bigint操作进行数据类型强转换。例如：
```
select '2022'::nvarchar2::bigint | '\x3a300000010000000000020010000000010002000300'::roaringbitmap;
                      ?column?                      
----------------------------------------------------
 \x3a300000010000000000030010000000010002000300e607
```
- 9.1.1.200及以上集群版本中支持使用nvarchar2类型直接作为bigint输入，无需再进行强转换。
 
表1Roaring Bitmap操作符列表 
| 操作符 | 描述                                               | 返回值类型          | 示例                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| =    | 比较两个roaringbitmap是否相等。                          | bool           | 两个位图完全相同，返回t，表示它们相等。 ``` SELECT rb_build('{1,2,3}') = rb_build('{1,2,3}'); ?column? ---------- t (1 row) ``` 两个位图包含的元素不同，返回f，表示它们不相等。 ``` SELECT rb_build('{2,3}') = rb_build('{1,2,3}'); ?column? ---------- f (1 row) ```                             |
| \<\>   | 比较两个roaringbitmap是否不相等。                         | bool             | 两个位图完全相同，返回f，表示它们相等。 ``` SELECT rb_build('{1,2,3}') <> rb_build('{1,2,3}'); ?column? ---------- f (1 row) ``` 两个位图包含的元素不同，返回t，表示它们不相等 ``` SELECT rb_build('{2,3}') <> rb_build('{1,2,3}'); ?column? ---------- t (1 row) ```                            |
| \&    | 计算两个roaringbitmap交集以后的结果。                      | roaringbitmap | 将两个位图交集后的结果，返回共同元素{2,3}。 ``` SELECT rb_to_array(rb_build('{2,3}') & rb_build('{1,2,3}')); rb_to_array ------------- {2,3} (1 row) ```                                                                                                                                                                   |
| \|    | 计算两个roaringbitmap并集后的结果。                       | roaringbitmap  | 计算两个位图的并集结果，返回所有不重复的元素{1,2,3}。 ``` SELECT rb_to_array(rb_build('{2,3}') | rb_build('{1,2,3}')); rb_to_array ------------- {1,2,3} (1 row) ```                                                                                                                                                        |
| \|    | 计算一个roaringbitmap增加一个元素后的结果。                    | roaringbitmap   | 计算包含元素{2,3}的位图添加元素4后的结果，返回{2,3,4}。 ``` SELECT rb_to_array(rb_build('{2,3}') | 4); rb_to_array ------------- {2,3,4} (1 row) ```                                                                                                                                                                      |
| #   | 计算两个roaringbitmap进行异或后的结果。                     | roaringbitmap  | 计算两个位图的异或，返回两个集合中不相同的元素结果{1}。 ``` SELECT rb_to_array(rb_build('{2,3}') # rb_build('{1,2,3}')); rb_to_array ------------- {1} (1 row) ```                                                                                                                                                            |
| -    | 计算属于第一个roaringbitmap，但是不属于第二个roaringbitmap的结果集。 | roaringbitmap   | 计算属于第一个位图{2,3,4}的元素，但这些元素不在第二个位图{1,2,3}中，返回结果 {4} ，表示元素4只在第一个位图。 ``` SELECT rb_to_array(rb_build('{2,3,4}') - rb_build('{1,2,3}')); rb_to_array ------------- {4} (1 row) ```                                                                                                                          |
| -   | 从roaringbitmap中去掉一个指定ID后的结果集。                  | roaringbitmap | 从位图{2,3,4}中去掉一个指定元素3，返回结果集{2,4}。 ``` SELECT rb_to_array(rb_build('{2,3,4}') - 3); rb_to_array ------------- {2,4} (1 row) ```                                                                                                                                                                        |
| @\>   | 操作符前面的roaringbitmap是否包含后面的roaringbitmap。       | bool             | 判断操作符@\>前面的位图{2,3,4}是否包含后面的位图{2,3}，返回t，表示包含。 ``` SELECT rb_build('{2,3,4}') @> rb_build('{2,3}'); ?column? ---------- t (1 row) ``` 判断操作符@\>前面的位图{2,3,4}是否包含后面的位图5，返回f，表示不包含。 ``` SELECT rb_build('{2,3,4}') @> 5; ?column? ---------- f (1 row) ``` |
| \<@   | 操作符前面的roaringbitmap是否被后面的roaringbitmap包含。         | bool          | 判断操作符\<@前面的4是否被后面的位图{2,3,4}包含，返回t，表示包含。 ``` SELECT  4 <@ rb_build('{2,3,4}'); ?column? ---------- t (1 row) ``` 判断操作符\<@前面的位图{2,3,4}是否被后面的位图{2,3}包含，返回f，表示不包含。 ``` SELECT rb_build('{2,3,4}') <@ rb_build('{2,3}'); ?column? ---------- f (1 row) ```     |
| \&\& | 两个roaringbitmap如果有交集返回true，否则返回false。            | bool           | 判断两个位图是否有交集，返回t，表示存在交集**{2,3}**。 ``` SELECT rb_build('{2,3,4}') && rb_build('{2,3}'); ?column? ---------- t (1 row) ``` 判断两个位图是否有交集，返回f，表示不存在任何交集。 ``` SELECT rb_build('{2,3,4}') && rb_build('{7,8,9}'); ?column? ---------- f (1 row) ```             |
   
