sql - 在 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)) 时可能会出现什么问题?
解决方案
在它被修复之前(请参阅错误 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'
)
推荐阅读
- laravel - 如何在不编辑原始文件的情况下覆盖 Laravel 包?
- r - 查找具有最长匹配字符串的行
- python - 写入带有缩进的文本文件
- javascript - 如何在vue js上测试Backend API的axios响应?
- spring - 如何使用 Spring Boot 2 访问 JSR 消息中的字段值?
- android - 如何在 Android 8.1 Oreo 中禁用 SELinux?
- spring - 如何忽略 springframe.sock 中的 SSL 证书
- c - 变量自动返回,函数结束时不直接返回
- c++ - 缓存 QSqlQueryModel 以模仿 OnManualSubmit
- c# - 也许我误解了Entity Framework的更新方法?