跳到主要内容
跳到主要内容

Array(T)

T 类型元素组成的数组,数组的起始索引为 1。T 可以是任何数据类型,包括数组。

创建数组

你可以使用函数创建数组:

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')
从服务器收到异常(版本 1.1.54388):
代码: 386. DB::Exception: 从 localhost:9000, 127.0.0.1 收到。DB::Exception: 类型 UInt8 和 String 之间不存在公共超类型,因为其中部分为 String/FixedString 类型,而其余部分不是。

数组大小

可以在不读取整列数据的情况下,使用 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)          │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘