Clickhouse 数组字段 - 检查是否有任何项目满足条件

Clickhouse Array Field - Check if ANY of the items meets condition

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

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

)

非常简单的定义。

但是现在我想过滤符合这样条件的记录:

my_array_field里面的任何一项都在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支持数组类型。

select * from my_table 
where arrayExists( i -> (i > 5000 and i < 6000) , my_array_field)