Clickhouse Array Field - 检查是否有任何项目符合条件

问题描述

在我的 Clickhouse 服务器中,我有一个带有 整数数组 字段的表:

CREATE TABLE my_table
(
  ...
  my_array_field Array(UInt32),...

)

非常简单的定义。

但现在我想过滤匹配这样的条件的记录:

my_array_field 中的任何 itens 都在 5000 到 6000 之间


postgres 中我做了这样的事情:

SELECT * FROM my_table WHERE EXISTS 
(
  SELECT 1 FROM unnest(my_array_field) AS my_array_field WHERE my_array_field BETWEEN 5000 AND 6000
)

但现在我在 clickhouse 遇到了同样的挑战,需要一些帮助。

提前致谢!

解决方法

尝试使用 arrayJoin 函数:

SELECT
    *,arrayJoin(my_array_field) AS val
FROM my_table
WHERE val BETWEEN 5000 AND 6000

查找详情ARRAY JOIN Clause


如果遇到一些性能问题,请考虑添加两个额外的列来存储数组中的 maxmin 值:

CREATE TABLE my_table
(
  ...
  my_array_field Array(UInt32),UInt32 min_my_array_field,UInt32 max_my_array_field,...
)

INSERT INTO my_table
VALUES (..,arr,arrayMin(arr),arrayMax(arr),..)
SELECT
    *,arrayJoin(my_array_field) AS val
FROM
(
    SELECT *
    FROM my_table
    WHERE (min_my_array_field <= 6000) AND (max_my_array_field >= 5000)
)
WHERE val BETWEEN 5000 AND 6000

skipping indexes :例如 bloom_filter 支持数组类型。

,
./ngrok http https://app.test:9283