0

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

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 中遇到了同样的挑战,需要一些帮助。

提前致谢!

4

2 回答 2

1

尝试使用arrayJoin函数:

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

查找详细信息ARRAY JOIN 子句


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

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

查看跳过索引:例如,bloom_filter支持数组类型。

于 2021-03-05T18:58:16.973 回答
1
select * from my_table 
where arrayExists( i -> (i > 5000 and i < 6000) , my_array_field)
于 2021-03-05T22:54:37.807 回答