数组(Array)数据类型通常用于存储变长字段。Lindorm宽表目前支持整型(INT/INTEGER、BIGINT、SMALLINT、TINYINT)、浮点型(FLOAT、DOUBLE)、字符串VARCHAR、布尔型BOOLEAN数组,您可以将宽表中的任意一个非主键列定义为数组类型。本文介绍如何使用数组类型。
引擎与版本
数组类型仅适用于2.7.8及以上版本的宽表引擎。
数组数据类型目前处于公测中,如需使用,请联系Lindorm技术支持(钉钉号:s0s3eg3)为您后台开通。
要求Lindorm SQL为2.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。intArr、integerArr、bigintArr、smallintArr、tinyintArr、floatArr、doubleArr、varcharArr、booleanArr是非主键列,数据类型分别是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的结构,示例表t2与t1结构完全相同。
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) | 判断数组中是否包含指定元素。
| |
ARRAY_CONTAINS(arr, element) | ||
ARRAY_CONTAINS(arr, array_literal) | 判断数组是否包含指定数组
| |
ARRAYS_OVERLAP(arr, array_literal) | 判断数组
| |
CARDINALITY(arr) | 返回数组的元素数据。 | |
ARRAY_SIZE(arr) |
包含关系判断(数组包含元素)
element = ANY(arr)
判断数组列arr中是否包含元素element。若element为null,则返回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_literal是arr的子集。例如,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 |
+------+------------------+