簡體   English   中英

ClickHouse 中的枚舉類型數組

[英]Array of enums type in ClickHouse

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']);

我想按類型列過濾數據,查詢返回 0 行:

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

它適用於 Int 值:

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

有沒有辦法通過枚舉的字符串值過濾數據?

如果有道理,您可以使用 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))'))

試試這個查詢:

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'] │
└────┴─────────────────────────┴──────────────────────────────┘
*/

對於我的用例,刪除Array(Enum)列並使用Array(LowCardinality(String))就足夠了,

CREATE TABLE IF NOT EXISTS test
(
    l_versions Array(LowCardinality(String)),
    _timestamp DateTime DEFAULT now()
) ENGINE = ReplacingMergeTree(_timestamp)
      PARTITION BY toYYYYMMDD(_timestamp)
      ORDER BY (_timestamp)
      TTL _timestamp + INTERVAL 1 MONTH;

INSERT INTO test(l_versions)
VALUES (array('v1', 'v3'));

SELECT * FROM test WHERE hasAny(l_versions,['v2']);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM