如何按数组列内容过滤Clickhouse表?

Mos*_*abe 5 clickhouse

我有一个带有一个Array(UInt16)列的Clickhouse表。我希望能够从该表中过滤结果,以仅获取其中数组列中的值高于阈值的行。我一直在尝试使用一些数组函数(arrayFilter和arrayExists)来实现这一点,但是我对SQL / Clickhouse查询语法不够熟悉,无法使其正常工作。

我使用以下方法创建了表:

CREATE TABLE IF NOT EXISTS ArrayTest (
    date Date,
    sessionSecond UInt16,
    distance Array(UInt16)
) Engine = MergeTree(date, (date, sessionSecond), 8192);
Run Code Online (Sandbox Code Playgroud)

距离值将是距日期之后一定秒数(sessionSecond)到某个点的距离。我添加了一些示例值,因此该表如下所示:

带有样本值的表格

现在,我想获取所有包含大于7的距离的行。我在这里找到了数组运算符文档并尝试了arrayExists函数,但是它不能按我期望的那样工作。从文档中可以看出,此函数“如果'arr'中至少有一个元素的'func'返回值不是0,则返回1。否则,返回0”。但是,当我在下面运行查询时,返回三个零,我应该得到一个0和两个1:

SELECT arrayExists(
    val -> val > 7,
    arrayEnumerate(distance))
FROM ArrayTest;
Run Code Online (Sandbox Code Playgroud)

最终,我想执行此选择,然后将其与表内容结合在一起,以仅返回存在= 1的行,但在此之前我需要第一步。我使用arrayExists错误吗?我发现更令人困惑的是,当我将比较值更改为2时,我得到的全是1。使用数组函数可以实现这种过滤吗?

谢谢

Mik*_*ail 6

您可以在WHERE子句中使用arrayExists。

SELECT * 
FROM ArrayTest
WHERE arrayExists(x -> x > 7, distance) = 1;
Run Code Online (Sandbox Code Playgroud)

如果您需要知道哪个值大于7,则另一种方法是使用ARRAY JOIN:

SELECT d, distance, sessionSecond 
FROM ArrayTest
ARRAY JOIN distance as d
WHERE d > 7
Run Code Online (Sandbox Code Playgroud)

  • 是的,您可以检查数组中的特定元素`SELECT * FROM ArrayTest WHERE distance[1] > 5` (2认同)