问题描述
在我的 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。
如果遇到一些性能问题,请考虑添加两个额外的列来存储数组中的 max 和 min 值:
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