由 T 类型元素构成的数组,数组索引从 1 开始。T 可以是任何数据类型,包括数组。
创建 Array
您可以使用函数来创建 Array:
array(T)也可以使用 []。
[]创建数组的示例:
SELECT array(1, 2) AS x, toTypeName(x)┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8) │
└───────┴─────────────────────────┘SELECT [1, 2] AS x, toTypeName(x)┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘使用数据类型
动态创建数组时,ClickHouse 会自动将参数类型确定为能够容纳所有已列出参数的最窄数据类型。如果包含任何 Nullable 或字面量 NULL 值,数组元素的类型也会变为 Nullable。
如果 ClickHouse 无法确定数据类型,则会抛出异常。例如,当尝试同时用字符串和数字创建数组时,就会发生这种情况 (SELECT array(1, 'a')) 。
自动检测数据类型的示例:
SELECT array(1, 2, NULL) AS x, toTypeName(x)┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
│ [1,2,NULL] │ Array(Nullable(UInt8)) │
└────────────┴───────────────────────────────┘如果尝试创建由不兼容数据类型构成的数组,ClickHouse 会抛出异常:
SELECT array(1, 'a')Received exception from server (version 1.1.54388):
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.Array 的大小
可以通过 size0 子列获取数组大小,而无需读取整个列。对于多维数组,可以使用 sizeN-1,其中 N 是所需的维度。
示例
CREATE TABLE t_arr (`arr` Array(Array(Array(UInt32)))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);
SELECT arr.size0, arr.size1, arr.size2 FROM t_arr;┌─arr.size0─┬─arr.size1─┬─arr.size2─┐
│ 1 │ [2] │ [[4,1]] │
└───────────┴───────────┴───────────┘从 Array 中读取嵌套子列
如果 Array 中的嵌套类型 T 具有子列 (例如,它是一个命名元组) ,则可以通过 Array(T) 类型以相同的子列名称读取这些子列。子列的类型将是原始子列类型对应的 Array。
示例
CREATE TABLE t_arr (arr Array(Tuple(field1 UInt32, field2 String))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]);
SELECT arr.field1, toTypeName(arr.field1), arr.field2, toTypeName(arr.field2) from t_arr;┌─arr.field1─┬─toTypeName(arr.field1)─┬─arr.field2────────────────┬─toTypeName(arr.field2)─┐
│ [1,2] │ Array(UInt32) │ ['Hello','World'] │ Array(String) │
│ [3,4,5] │ Array(UInt32) │ ['This','is','subcolumn'] │ Array(String) │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘