ClickHouse 中的枚举类型数组
Array of enums type in ClickHouse
在 ClickHouse 21.4 中,我创建了一个 table 和枚举列数组:
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']);
我想按类型列过滤数据,查询returns 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'] │
└────┴─────────────────────────┴──────────────────────────────┘
*/
在 ClickHouse 21.4 中,我创建了一个 table 和枚举列数组:
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']);
我想按类型列过滤数据,查询returns 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'] │
└────┴─────────────────────────┴──────────────────────────────┘
*/