首页 / 数组和 Map
ARRAY_CONTAINS 判断数组是否包含元素
ARRAY_CONTAINS 判断数组中是否有指定元素,七个引擎都同名可用。差异在返回类型和版本:StarRocks 返回 1 或 0 而不是布尔值,Hologres 需要 V1.3.19 及以上版本,并且不支持常量数组。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | ARRAY_CONTAINS(a, v) | 返回 BOOLEAN。v 的类型必须与数组元素类型一致。 | 官方文档 |
| Hologres | 支持 | ARRAY_CONTAINS(array, target_value) | Hologres V1.3.19 起提供,返回 BOOLEAN。文档说明暂不支持常量查询,例如直接对 ARRAY[...] 字面量调用。 | 官方文档 |
| StarRocks | 支持 | array_contains(any_array, any_element) | 包含时返回 1,否则返回 0。可以判断数组中是否有 NULL,也可以判断多维数组是否包含某个子数组,子数组的元素顺序必须一致。 | 官方文档 |
| Doris | 支持 | ARRAY_CONTAINS(arr, value) | 1.2.0 起提供,返回 BOOLEAN。数组为 NULL 时返回 NULL。 | 官方文档 |
| Hive | 支持 | array_contains(Array<T>, value) | 数组包含该值时返回 TRUE。 | 官方文档 |
| Spark SQL | 支持 | array_contains(array, value) | Spark 1.5.0 起提供,返回布尔值。 | 官方文档 |
| Flink SQL | 支持 | ARRAY_CONTAINS(haystack, needle) | 可以判断数组中是否有 NULL 元素。数组为 NULL 时返回 NULL。needle 会隐式转换为数组元素的类型。 | 官方文档 |
迁移注意事项
- StarRocks 返回 1 或 0。写成 WHERE array_contains(tags, 'vip') 可以正常过滤,但把结果写入布尔列或和 true 比较时,要注意类型差异。
- Hologres 需要 V1.3.19 及以上版本,并且不支持对常量数组调用,例如 SELECT array_contains(ARRAY[1,2], 1) 这类测试语句。
- 判断数组中是否有 NULL 的行为各引擎不同。StarRocks 和 Flink 文档写明支持,其他引擎没有说明,迁移前建议实测。
- MaxCompute 要求 v 与数组元素类型一致,例如用整数去判断 array<string> 会报错,需要先 CAST。
示例
筛选带 vip 标签的用户
SELECT user_id FROM user_tags WHERE ARRAY_CONTAINS(tags, 'vip');SELECT user_id FROM user_tags WHERE ARRAY_CONTAINS(tags, 'vip');SELECT user_id FROM user_tags WHERE array_contains(tags, 'vip') = 1;SELECT user_id FROM user_tags WHERE ARRAY_CONTAINS(tags, 'vip');SELECT user_id FROM user_tags WHERE array_contains(tags, 'vip');SELECT user_id FROM user_tags WHERE array_contains(tags, 'vip');SELECT user_id FROM user_tags WHERE ARRAY_CONTAINS(tags, 'vip');