首页 > 解决方案 > 在 ClickHouse 中使用 Array(Tuple(LowCardinality(String), Int32))

问题描述

我有一张桌子

CREATE TABLE table (
    id Int32,
    values Array(Tuple(LowCardinality(String), Int32)),
    date Date
) ENGINE MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date)

但是在执行请求时

SELECT count(*)
FROM table
WHERE (arrayExists(x -> ((x.1) = toLowCardinality('pattern')), values) = 1)

我收到一个错误

Code: 49. DB::Exception: Received from clickhouse:9000. DB::Exception: Cannot capture column 3 because it has incompatible type: got String, but LowCardinality(String) is expected..

如果我替换列 'values' 值 Array(Tuple(String, Int32)) 则请求执行时不会出错。

使用 Array(Tuple(LowCardinality(String), Int32)) 时可能会出现什么问题?

标签: sqlclickhouse

解决方案


在它被修复之前(请参阅错误 7815),可以使用此解决方法:

SELECT uniqExact((id, date)) AS count
FROM table
ARRAY JOIN values
WHERE values.1 = 'pattern'

对于有多个Array列的情况,可以这样使用:

SELECT uniqExact((id, date)) AS count
FROM 
(
    SELECT 
        id, 
        date, 
        arrayJoin(values) AS v, 
        arrayJoin(values2) AS v2
    FROM table
    WHERE v.1 = 'pattern' AND v2.1 = 'pattern2'
)

推荐阅读