数组类型(公测中)

更新时间:
复制为 MD 格式

数组(Array)数据类型通常用于存储变长字段。Lindorm宽表目前支持整型(INT/INTEGER、BIGINT、SMALLINT、TINYINT)、浮点型(FLOAT、DOUBLE)、字符串VARCHAR、布尔型BOOLEAN数组,您可以将宽表中的任意一个非主键列定义为数组类型。本文介绍如何使用数组类型。

引擎与版本

数组类型仅适用于2.7.8及以上版本的宽表引擎。

重要
  • 数组数据类型目前处于公测中,如需使用,请联系Lindorm技术支持(钉钉号:s0s3eg3)为您后台开通。

  • 要求Lindorm SQL2.8.7.0及以上版本。查看Lindorm SQL的版本请参见SQL版本说明

前提条件

使用限制

Lindorm宽表的主键列及索引列暂不支持Array类型。

DDL

您可以在创建表或修改表时,指定相关列的数据类型为Array。详细语法说明,请参见CREATE TABLE

示例如下:

-- 创建示例表t1
CREATE TABLE t1 (id INT, intArr ARRAY<INT>, integerArr ARRAY<INTEGER>, bigintArr ARRAY<BIGINT>, smallintArr ARRAY<SMALLINT>, tinyintArr ARRAY<TINYINT>, floatArr ARRAY<FLOAT>, doubleArr ARRAY<DOUBLE>, varcharArr ARRAY<VARCHAR>, booleanArr ARRAY<BOOLEAN>, PRIMARY KEY(id));

-- 创建示例表t2
CREATE TABLE t2 (id INT, intArr INT[], integerArr INTEGER[], bigintArr BIGINT[], smallintArr SMALLINT[], tinyintArr TINYINT[], floatArr FLOAT[], doubleArr DOUBLE[], varcharArr VARCHAR[], booleanArr BOOLEAN[], PRIMARY KEY(id));

上述示例中,表t1、t2的结构是相同的。id是主键列,其数据类型是INT。intArrintegerArrbigintArrsmallintArrtinyintArrfloatArrdoubleArrvarcharArrbooleanArr是非主键列,数据类型分别是INT数组、INT数组、BIGINT数组、SMALLINT数组、TINYINT数组、FLOAT数组、DOUBLE数组、VARCHAR数组、BOOLEAN数组。

说明

Lindorm的数组类型目前仅支持一维数组。

您可以执行以下语句查看示例表的结构:

DESCRIBE <示例表名>;

以表t1为例,返回结果如下:

+--------------+------------+-------------+-----------------+----------------+------------+-------------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | TYPE            | IS_PRIMARY_KEY | SORT_ORDER | IS_AUTO_INCREMENT | IS_LOCAL_UNIQUE |
+--------------+------------+-------------+-----------------+----------------+------------+-------------------+-----------------+
| default      | t1         | id          | INT             | true           | ASC        | false             | false           |
| default      | t1         | intArr      | ARRAY<INT>      | false          | none       | false             | false           |
| default      | t1         | integerArr  | ARRAY<INT>      | false          | none       | false             | false           |
| default      | t1         | bigintArr   | ARRAY<BIGINT>   | false          | none       | false             | false           |
| default      | t1         | smallintArr | ARRAY<SMALLINT> | false          | none       | false             | false           |
| default      | t1         | tinyintArr  | ARRAY<TINYINT>  | false          | none       | false             | false           |
| default      | t1         | floatArr    | ARRAY<FLOAT>    | false          | none       | false             | false           |
| default      | t1         | doubleArr   | ARRAY<DOUBLE>   | false          | none       | false             | false           |
| default      | t1         | varcharArr  | ARRAY<VARCHAR>  | false          | none       | false             | false           |
| default      | t1         | booleanArr  | ARRAY<BOOLEAN>  | false          | none       | false             | false           |
+--------------+------------+-------------+-----------------+----------------+------------+-------------------+-----------------+

您可以通过相同方式查看示例表t2的结构,示例表t2t1结构完全相同。

DML

UPSERT

您可以通过以下两种方式写入Array类型的数据。

  • 使用方括号([])或大括号({})表示数组,以字符串格式写入。例如:'[element1, element2, ...]' 或 '{element1, element2, ...}'

    说明

    element的类型是字符串,则需要使用半角双引号("")引起来,例如'["a", "b", "c"]'

    示例如下:

    UPSERT INTO t1(id, intArr, integerArr, bigintArr, smallintArr, tinyintArr, floatArr, doubleArr, varcharArr, booleanArr) VALUES (1, '[1, 2]', '[1, 2]', '[1, 2]', '[1, 2]', '[1, 2]', '[1.1, 2.2]', '[1.1, 2.2]', '["a", "b"]', '[true, false]');
    
    UPSERT INTO t2(id, intArr, integerArr, bigintArr, smallintArr, tinyintArr, floatArr, doubleArr, varcharArr, booleanArr) VALUES (1, '{1, 2}', '{1, 2}', '{1, 2}', '{1, 2}', '{1, 2}', '{1.1, 2.2}', '{1.1, 2.2}', '{"a", "b"}', '{true, false}');
  • 使用Array构造器表示数组,即ARRAY[element1, element2, ...]

    说明

    element的类型是字符串,则需要使用半角单引号('')引起来,例如ARRAY['a', 'b', 'c']

    示例如下:

    UPSERT INTO t2(id, intArr, integerArr, bigintArr, smallintArr, tinyintArr, floatArr, doubleArr, varcharArr, booleanArr) VALUES (2, ARRAY[3, 4], ARRAY[3, 4], ARRAY[3, 4], ARRAY[3, 4], ARRAY[3, 4], ARRAY[3.3, 4.4], ARRAY[3.3, 4.4], ARRAY['c', 'd'], ARRAY[true, false]);

UPDATE

您可以通过array_append在数组的尾部添加元素,每次最多可以插入4个元素。

  • 示例一:使用array_append在数组尾部添加一个元素。

    UPDATE t1 SET intArr = ARRAY_APPEND(intArr, 3), integerArr = ARRAY_APPEND(integerArr, 3), bigintArr = ARRAY_APPEND(bigintArr, 3), smallintArr = ARRAY_APPEND(smallintArr, 3), tinyintArr = ARRAY_APPEND(tinyintArr, 3), floatArr = ARRAY_APPEND(floatArr, 3.3), doubleArr = ARRAY_APPEND(doubleArr, 3.3), varcharArr = ARRAY_APPEND(varcharArr, 'c'), booleanArr = ARRAY_APPEND(booleanArr, true) WHERE id = 1;
  • 示例二:使用array_append在数组尾部添加四个元素。

    UPDATE t1 SET intArr = ARRAY_APPEND(intArr, 4, 5, 6, 7), integerArr = ARRAY_APPEND(integerArr, 4, 5, 6, 7), bigintArr = ARRAY_APPEND(bigintArr, 4, 5, 6, 7), smallintArr = ARRAY_APPEND(smallintArr, 4, 5, 6, 7), tinyintArr = ARRAY_APPEND(tinyintArr, 4, 5, 6, 7), floatArr = ARRAY_APPEND(floatArr, 4.4, 5.5, 6.6, 7.7), doubleArr = ARRAY_APPEND(doubleArr, 4.4, 5.5, 6.6, 7.7), varcharArr = ARRAY_APPEND(varcharArr, 'd', 'e', 'f', 'g'), booleanArr = ARRAY_APPEND(booleanArr, false, false, false, false) WHERE id = 1;
说明

支持向数组中添加null元素,例如ARRAY_APPEND(intArr, 1,null)

SELECT

查询所有列

数组将以JSON Array的字符串形式返回。

  • 示例一:查询表t1中所有数据。

    SELECT * FROM t1;

    返回结果:

    +------+-----------------+-----------------+-----------------+-----------------+-----------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------------------+
    | id   | intArr          | integerArr      | bigintArr       | smallintArr     | tinyintArr      | floatArr                      | doubleArr                     | varcharArr                    | booleanArr                                |
    +------+-----------------+-----------------+-----------------+-----------------+-----------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------------------+
    |    1 | [1,2,3,4,5,6,7] | [1,2,3,4,5,6,7] | [1,2,3,4,5,6,7] | [1,2,3,4,5,6,7] | [1,2,3,4,5,6,7] | [1.1,2.2,3.3,4.4,5.5,6.6,7.7] | [1.1,2.2,3.3,4.4,5.5,6.6,7.7] | ["a","b","c","d","e","f","g"] | [true,false,true,false,false,false,false] |
    +------+-----------------+-----------------+-----------------+-----------------+-----------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------------------+
  • 示例二:查询表t2中所有数据。

    SELECT * FROM t2;

    返回结果:

    +------+--------+------------+-----------+-------------+------------+-----------+-----------+------------+--------------+
    | id   | intArr | integerArr | bigintArr | smallintArr | tinyintArr | floatArr  | doubleArr | varcharArr | booleanArr   |
    +------+--------+------------+-----------+-------------+------------+-----------+-----------+------------+--------------+
    |    1 | [1,2]  | [1,2]      | [1,2]     | [1,2]       | [1,2]      | [1.1,2.2] | [1.1,2.2] | ["a","b"]  | [true,false] |
    |    2 | [3,4]  | [3,4]      | [3,4]     | [3,4]       | [3,4]      | [3.3,4.4] | [3.3,4.4] | ["c","d"]  | [true,false] |
    +------+--------+------------+-----------+-------------+------------+-----------+-----------+------------+--------------+

查询数组中指定元素

使用arr[i]获取数组arr中第i个元素,下标从1开始。下标小于1或者大于数组长度,会返回NULL

  • 示例一:获取数组中第i个元素。

    SELECT intArr[1], integerArr[2], bigintArr[3], smallintArr[4], tinyintArr[5], floatArr[6], doubleArr[7], varcharArr[1], booleanArr[1], booleanArr[2] FROM t1 WHERE id = 1;

    返回结果:

    +-----------+---------------+--------------+----------------+---------------+-------------+--------------+---------------+---------------+---------------+
    | intArr[1] | integerArr[2] | bigintArr[3] | smallintArr[4] | tinyintArr[5] | floatArr[6] | doubleArr[7] | varcharArr[1] | booleanArr[1] | booleanArr[2] |
    +-----------+---------------+--------------+----------------+---------------+-------------+--------------+---------------+---------------+---------------+
    |         1 |             2 |            3 |              4 |             5 |         6.6 |          7.7 | a             |             1 |             0 |
    +-----------+---------------+--------------+----------------+---------------+-------------+--------------+---------------+---------------+---------------+
  • 示例二:(异常用例)获取数组中第i个元素,i小于1或大于数组长度。

    SELECT intArr[0], integerArr[10], doubleArr[-1], varcharArr[100] FROM t1 WHERE id = 1;

    返回结果:

    +-----------+----------------+---------------+-----------------+
    | intArr[0] | integerArr[10] | doubleArr[-1] | varcharArr[100] |
    +-----------+----------------+---------------+-----------------+
    |      NULL |           NULL |          NULL | NULL            |
    +-----------+----------------+---------------+-----------------+

等值查询

使用等值条件array = array_literal,获取满足条件的数据。

说明
  • 两个数组必须完全一样(包括元素顺序)才会被视为相等。

  • 数组常量array_literal必须用数组构造器来表示,即ARRAY[element1, element2, ...]

  • 示例一:查询intArr与数组[1,2,3,4,5,6,7]相等的行,并返回其ID。

    SELECT id FROM t1 WHERE id >= 0 AND id <= 10 AND intArr = ARRAY[1,2,3,4,5,6,7];

    返回结果:

    +------+
    | id   |
    +------+
    |    1 |
    +------+
  • 示例二:查询varcharArr与数组['c', 'd']相等的行,并返回其ID。

    SELECT id FROM t2 WHERE id >= 0 AND id <= 10 AND varcharArr = ARRAY['c', 'd'];

    返回结果:

    +------+
    | id   |
    +------+
    |    2 |
    +------+

函数说明

函数概览

针对数组类型的数据,Lindorm提供了以下函数,以满足更复杂的查询需求。

函数功能分类

函数

说明

包含关系判断(数组包含元素)

element = ANY(arr)

判断数组中是否包含指定元素。

  • arr:数组列的列名。

  • element:与数组类型元素类型相同的常量。

ARRAY_CONTAINS(arr, element)

包含关系判断(数组包含数组)

ARRAY_CONTAINS(arr, array_literal)

判断数组是否包含指定数组array_literal里的每一个元素。

  • arr:数组列的列名。

  • array_literal:数组常量,必须用数组构造器来表示,即ARRAY[element1, element2, ...]

arr为数组列的列名,array_literal是数组常量。

数组相交判断

ARRAYS_OVERLAP(arr, array_literal)

判断数组arr与常量array_literal是否包含共同元素。

  • arr:数组列的列名。

  • array_literal:数组常量,必须用数组构造器来表示,即ARRAY[element1, element2, ...]

统计数组元素数目

CARDINALITY(arr)

返回数组的元素数据。arr为数组列的列名。

ARRAY_SIZE(arr)

包含关系判断(数组包含元素)

element = ANY(arr)

判断数组列arr中是否包含元素element。若elementnull,则返回null。若arr为空,则返回false。

  • 示例一:判断类型为INT的数组列intArr中是否包含1

    SELECT id, intArr FROM t1 WHERE id >= 0 AND id <= 10 AND 1 = ANY(intArr);

    返回结果:

    +------+-----------------+
    | id   | intArr          |
    +------+-----------------+
    |    1 | [1,2,3,4,5,6,7] |
    +------+-----------------+
  • 示例二:判断类型为DOUBLE的数组列doubleArr中是否包含1.1

    SELECT id, doubleArr FROM t1 WHERE id >= 0 AND id <= 10 AND 1.1 = ANY(doubleArr);

    返回结果:

    +------+-------------------------------+
    | id   | doubleArr                     |
    +------+-------------------------------+
    |    1 | [1.1,2.2,3.3,4.4,5.5,6.6,7.7] |
    +------+-------------------------------+
  • 示例三:判断类型为VARCHAR的数组列varcharArr中是否包含c

    SELECT id, varcharArr FROM t2 WHERE id >= 0 AND id <= 10 AND 'c' = ANY(varcharArr);

    返回结果:

    +------+------------+
    | id   | varcharArr |
    +------+------------+
    |    2 | ["c","d"]  |
    +------+------------+
  • 示例四:判断类型为BOOLEAN的数组列是否包含布尔常量true。

    SELECT id, booleanArr FROM t2 WHERE id >= 0 AND id <= 10 AND true = ANY(booleanArr);

    返回结果:

    +------+--------------+
    | id   | booleanArr   |
    +------+--------------+
    |    1 | [true,false] |
    |    2 | [true,false] |
    +------+--------------+

ARRAY_CONTAINS(arr, element)

判断数组列arr中是否包含元素element

  • 示例一:判断类型为INT的数组列intArr中是否包含1

    SELECT id, intArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(intArr, 1);

    返回结果:

    +------+-----------------+
    | id   | intArr          |
    +------+-----------------+
    |    1 | [1,2,3,4,5,6,7] |
    +------+-----------------+
  • 示例二:判断类型为DOUBLE的数组列doubleArr中是否包含1.1

    SELECT id, doubleArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(doubleArr, 1.1);

    返回结果:

    +------+-------------------------------+
    | id   | doubleArr                     |
    +------+-------------------------------+
    |    1 | [1.1,2.2,3.3,4.4,5.5,6.6,7.7] |
    +------+-------------------------------+
  • 示例三:判断类型为VARCHAR的数组列varcharArr中是否包含c

    SELECT id, varcharArr FROM t2 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(varcharArr, 'c');

    返回结果:

    +------+------------+
    | id   | varcharArr |
    +------+------------+
    |    2 | ["c","d"]  |
    +------+------------+
  • 示例四:判断类型为BOOLEAN的数组列是否包含布尔常量true。

    SELECT id, booleanArr FROM t2 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(booleanArr, false);

    返回结果:

    +------+--------------+
    | id   | booleanArr   |
    +------+--------------+
    |    1 | [true,false] |
    |    2 | [true,false] |
    +------+--------------+

包含关系判断(数组包含数组)

使用ARRAY_CONTAINS(arr, array_literal)函数,判断数组列arr是否包含数组array_literal里的每一个元素。

重要

该函数仅判断arr是否包含array_literal中的每个元素。若任一参数为null,返回null;若array_literal包含null元素,返回null。

函数返回true时,并不代表array_literalarr的子集。例如,arr = ARRAY[1],array_literal = ARRAY[1, 1, 1]时,函数返回值为true,但array_literal的元素数量比arr大,不是arr的子集。

  • 示例一:判断类型为INT的数组列intArr是否包含ARRAY[1,2]中的每一个元素。

    SELECT id, intArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(intArr, ARRAY[1,2]);

    返回结果:

    +------+-----------------+
    | id   | intArr          |
    +------+-----------------+
    |    1 | [1,2,3,4,5,6,7] |
    +------+-----------------+
  • 示例二:判断类型为DOUBLE的数组列doubleArr是否包含ARRAY[1.1,1.1]中的每一个元素。

    SELECT id, doubleArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(doubleArr, ARRAY[1.1, 1.1]);

    返回结果:

    +------+-------------------------------+
    | id   | doubleArr                     |
    +------+-------------------------------+
    |    1 | [1.1,2.2,3.3,4.4,5.5,6.6,7.7] |
    +------+-------------------------------+
  • 示例三:判断类型为VARCHAR的数组列varcharArr是否包含ARRAY['c', 'b', 'a']中的每一个元素。

    SELECT id, varcharArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(varcharArr, ARRAY['c', 'b', 'a']);

    返回结果:

    +------+-------------------------------+
    | id   | varcharArr                    |
    +------+-------------------------------+
    |    1 | ["a","b","c","d","e","f","g"] |
    +------+-------------------------------+
  • 示例四:判断类型为BOOLEAN的数组列booleanArr是否包含ARRAY[true, true, true]中的每一个元素。

    SELECT id, booleanArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAY_CONTAINS(booleanArr, ARRAY[true, true, true]);

    返回结果:

    +------+-------------------------------------------+
    | id   | booleanArr                                |
    +------+-------------------------------------------+
    |    1 | [true,false,true,false,false,false,false] |
    +------+-------------------------------------------+

数组相交判断

使用ARRAYS_OVERLAP(arr, array_literal)函数,判断数组列arr与数组array_literal是否存在公共元素。若任一参数为null,返回null;若无公共元素或者公共元素为null,返回false。

  • 示例一:判断类型为INT的数组列intArr与数组ARRAY[1, 10, 100]是否存在公共元素,不存在返回null。

    SELECT id, intArr FROM t1 WHERE id >= 0 AND id <= 10 AND ARRAYS_OVERLAP(intArr, ARRAY[1, 10, 100]);

    返回结果:

    +------+-----------------+
    | id   | intArr          |
    +------+-----------------+
    |    1 | [1,2,3,4,5,6,7] |
    +------+-----------------+
  • 示例二:判断类型为DOUBLE的数组列doubleArr与数组ARRAY[1.1, 1.1]是否存在公共元素,不存在返回null。

    SELECT id, doubleArr FROM t2 WHERE id >= 0 AND id <= 10 AND ARRAYS_OVERLAP(doubleArr, ARRAY[1.1, 1.1]);

    返回结果:

    +------+-----------+
    | id   | doubleArr |
    +------+-----------+
    |    1 | [1.1,2.2] |
    +------+-----------+
  • 示例三:判断类型为VARCHAR的数组列varcharArr与数组ARRAY['a', 'c']是否存在公共元素,不存在返回null。

    SELECT id, varcharArr FROM t2 WHERE id >= 0 AND id <= 10 AND ARRAYS_OVERLAP(varcharArr, ARRAY['a', 'c']);

    返回结果:

    +------+------------+
    | id   | varcharArr |
    +------+------------+
    |    1 | ["a","b"]  |
    |    2 | ["c","d"]  |
    +------+------------+
  • 示例四:判断类型为BOOLEAN的数组列booleanArr与数组ARRAY[true]是否存在公共元素,不存在返回空。

    SELECT id, booleanArr FROM t2 WHERE id >= 0 AND id <= 10 AND ARRAYS_OVERLAP(booleanArr, ARRAY[true]);

    返回结果:

    +------+--------------+
    | id   | booleanArr   |
    +------+--------------+
    |    1 | [true,false] |
    |    2 | [true,false] |
    +------+--------------+

统计数组元素数目

CARDINALITY(arr)

返回数组列arr的元素数目。

  • 示例一:返回类型为INT的数组列intArr的元素数目。

    SELECT id, CARDINALITY(intArr) AS intArraySize FROM t1;

    返回结果:

    +------+--------------+
    | id   | intArraySize |
    +------+--------------+
    |    1 |            7 |
    +------+--------------+
  • 示例二:统计示例表t2中,id在[0,10]之间,且intArr的元素数目大于5的行。

    SELECT COUNT(*) FROM t2 WHERE id >= 0 AND id <= 10 AND CARDINALITY(intArr) > 5;

    返回结果:

    +--------+
    | EXPR$0 |
    +--------+
    |      0 |
    +--------+
  • 示例三:统计示例表t1中,id在[0,10]之间,且intArr的元素数目大于5的行。

    SELECT COUNT(*) FROM t1 WHERE id >= 0 AND id <= 10 AND CARDINALITY(intArr) > 5;

    返回结果:

    +--------+
    | EXPR$0 |
    +--------+
    |      1 |
    +--------+

ARRAY_SIZE(arr)

ARRAY_SIZE(arr)函数用于返回数组列arr的元素数目。

以下示例返回类型为VARCHAR的数组列varcharArr的元素数目。

SELECT id, ARRAY_SIZE(varcharArr) AS varcharArraySize FROM t1;

返回结果:

+------+------------------+
| id   | varcharArraySize |
+------+------------------+
|    1 |                7 |
+------+------------------+