【问题标题】:Clickhouse Array Field - Check if ANY of the items meets conditionClickhouse 数组字段 - 检查是否有任何项目符合条件
【发布时间】:2021-03-05 18:37:31
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: sql clickhouse


    【解决方案1】:
    select * from my_table 
    where arrayExists( i -> (i > 5000 and i < 6000) , my_array_field)
    

    【讨论】:

    • 我在我的代码中使用了你的答案!非常感谢。但就我而言,它失败了,因为数组可以为空。所以我不得不添加:WHERE notEmpty(my_array_field) AND arrayExists(x -&gt;...如果你能把它添加到你的答案中,那就更棒了。
    • ????不可能。 arrayExists 为空数组返回 0。 notEmpty(my_array_field) AND 没有意义。
    【解决方案2】:

    尝试使用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支持Array-type。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2014-02-03
      • 2020-06-11
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多