【问题标题】:Array of enums type in ClickHouseClickHouse 中的枚举类型数组
【发布时间】:2021-09-17 01:23:36
【问题描述】:

ClickHouse 21.4 我创建了一个包含枚举列数组的表:

CREATE TABLE test_array_enum (
    id String,
    fixation_at DateTime64(3, 'UTC'),
    types Array(
        Enum(
            'FIRST_TYPE' = 1, 'SECOND_TYPE' = 2, 'THIRD_TYPE' = 3,
            'FOURTH_TYPE' = 4
        )
    )
)
ENGINE = ReplacingMergeTree
ORDER BY (fixation_at, id);

填写一些数据:

INSERT INTO test_array_enum (id, fixation_at, types) VALUES ('1', now64(), []),
                                                            ('2', now64(), ['FIRST_TYPE']),
                                                            ('3', now64(), ['SECOND_TYPE', 'THIRD_TYPE']),
                                                            ('4', now64(), ['FOURTH_TYPE']);

我想按types列过滤数据,查询返回0行:

SELECT *
FROM test_array_enum
WHERE hasAny(types, ['SECOND_TYPE', 'THIRD_TYPE']);

它适用于 Int 值:

SELECT *
FROM test_array_enum
WHERE hasAny(types, [2, 3]);

有没有办法通过枚举的字符串值过滤数据?

【问题讨论】:

    标签: sql arrays enums clickhouse


    【解决方案1】:

    如果有道理,你可以使用 cast

    SELECT *
    FROM test_array_enum
    WHERE hasAny(types, CAST(['SECOND_TYPE', 'THIRD_TYPE'], 'Array(Enum(\'FIRST_TYPE\' = 1, \'SECOND_TYPE\' = 2, \'THIRD_TYPE\' = 3, \'FOURTH_TYPE\' = 4))'))
    

    【讨论】:

    • 是的,但无论如何我都需要在代码中存储字符串和 int 值之间的映射。
    【解决方案2】:

    试试这个查询:

    SELECT *
    FROM test_array_enum
    WHERE arrayFirstIndex(x -> x = 'SECOND_TYPE' OR x = 'THIRD_TYPE', types) > 0
    
    /*
    ┌─id─┬─────────────fixation_at─┬─types────────────────────────┐
    │ 3  │ 2021-07-08 02:11:21.238 │ ['SECOND_TYPE','THIRD_TYPE'] │
    └────┴─────────────────────────┴──────────────────────────────┘
    */
    

    【讨论】:

    • 是的,它运行良好。其实OR可以换成INWHERE arrayFirstIndex(x -> x IN ('SECOND_TYPE', 'THIRD_TYPE'), types) > 0。我认为最好通过代码生成该条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2021-06-14
    • 2012-09-16
    • 2021-11-14
    • 2010-10-11
    相关资源
    最近更新 更多