暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 数组类型

墨天轮 2019-10-12
1301

数组类型

数组是一组数据的集合。集合中的数据类型可以是本章节中描述的基础数据类型。

常量表达式

语法格式:

ARRAY [ param ]

'{ param }'

功能:存储一组数据集合的数组。

参数说明:

  • param :数组包含的值,允许出现零个或多个,多个值之间用逗号分隔,成员没有值可填写为NULL。
  • 以'{ param }' 这种格式作为数组常量时,其中的字符串类型的元素不能再以单引号开始和结束,需要使用双引号。两个连续单引号转换为一个单引号。
  • 以第一个元素的数据类型作为数组的数据类型,要求数组中所有元素的类型相同,或者能够相互转换。

注意:

  • 不支持BINARY,VARBINARY,CLOB,BLOB,CURSOR,RAW,IMAGE数据类型的数组。
  • 不支持多维数组。
  • 不支持在数组类型的字段上创建索引、主键、外键和唯一键约束。

数组类型的应用场景

  • 建表语句中支持将字段类型设置为数组类型:

    通过在字段的数据类型后增加 [ ] 或者 [m] (m >= 0)标识字段是具有该数据类型的数组。给定的数组长度m没有实际作用。当前支持变长的数组,数组最大长度可达(2^31 - 1)。数组字段中的所有元素值实际存储于LOB段中。LOB段最大支持4GB,因此实际能够存储的元素个数取决于元素数据类型,不同的数据类型由于存储长度不同,导致存储的元素个数也不同。

  • 访问数组类型的表字段
    • SELECT
      • 访问数组类型列的单个元素:
        SELECT col_name[n] from table_name

        下标从1开始。如果指定的下标元素没有赋值,则返回NULL。

      • 访问多个连续元素:切片形式访问数组时,返回的仍然是数组类型(col_name [1:1] 返回的是具有1个元素值的数组)。指定范围内的元素如果没有赋值,返回NULL值。
      • 数组类型的字段输出格式:
        { value }

        value:数组中元素的值,允许出现零个或多个,value值之间以逗号分隔。没有赋值的元素统一输出为大写NULL。

    • INSERT
      • 新增一条记录。数组类型的字段值使用数组常量赋值。不赋值的元素值用NULL填充。
      • 不支持分片的形式增加一条记录。
      • 支持使用子查询返回结果方式写入数组字段。 要求返回结果集与表的字段数量相同外,还需要满足如下要求:
        • 如果结果集存在数组类型字段,而表中对应的字段不是数组类型,则报错。

        • 如果结果集中不存在数组类型字段,而表中对应的字段为数组类型,会检查结果集中的字段是否可以转换为数组类型:要求字段的值为 '{value, [...]}' 类型的字符串类型。如果是其他类型,则不能转换为数组类型,会报错。

        • 如果结果集中存在数组类型字段,表中对应字段也为数组类型,且结果集中的元素数据类型能够转换为表字段定义的数据类型,则新增记录成功,反之则报错。

    • UPDATE
      • 更新单个元素的值:将数组字段中指定元素的值更新
        UPDATE table_name SET col_name[n] = value ;
      • 更新多个连续的元素值:
        UPDATE table_name SET col_name[m:n] = value;

        更新的规则如下:右边数组第一个元素赋予col_name[m], 第二个元素赋予col_name[m+1], 以此类推,直到col_name[n]元素值。如果元素数量不匹配,则报错:GS-01363:source array elements count does not match。

      • 更新时指定的元素下标不能小于0,且不能超过 (2^31 - 1)。
      • 支持以查询结果集方式更新数组元素的值。要求查询返回的值也是数组类型,或者可以转换为数组类型,且转换后的每个元素也能转换为对应表字段的数据类型。
    • DELETE
      • 删除一条记录时,记录中的数组字段中所有的值也会被删除。
    • MERGE
      MERGE INTO [ schema_name. ] table_name USING { [ schema_name. ] table_name | [ schema_name. ] view_name | select_query } [ alias ] ON ( condition ) { WHEN MATCHED THEN UPDATE SET column_name = expression [ , ... ] [ WHERE ( condition ) ] |WHEN NOT MATCHED THEN INSERT ( column_name [ , ... ] ) VALUES ( expression [ , ... ] ) [ WHERE ( condition ) ] }[ ... ]
      • select_query 子句遵循上述规范。

      • condition 子句中的匹配条件:支持访问数组类型的元素。

      • UPDATE子句和INSERT子句中支持访问数组类型的字段。

  • 存储过程和自定义函数
    • 支持存储过程和自定义函数的入参设置为数组类型。
      CREATE [ OR REPLACE ] PROCEDURE [ IF NOT EXISTS ] [schema_name.]procedure_nameargs_list) { IS | AS } [ param_list ] BEGIN statement; END; /
      • args_list 参数列表,支持在输入参数(in 类型参数)的数据类型关键字后加上 [ ] 表示传入的参数是一个数组类型。
    • 支持函数的返回值为数组类型。
      CREATE [OR REPLACE] [IF [NOT] EXIST] FUNCTION [schema_name.]function_name [(args_list)] RETURN data_type { IS | AS } [param-list] BEGIN statement; RETURN expression; ... END;
      • data_type : 返回值的数据类型,支持在数据类型关键字后加上 [ ] 表示返回的是一个数组类型,数组中的元素具有data_type指定的数据类型。
    • 支持自定义变量为数组类型。
  • 约束:
    • 数组类型暂不支持操作符,包括:比较操作符(=,!=,>,<,>=,<=)、连接操作符(||), 关系操作符。
    • order by 表达式中暂不支持包含数组类型。
    • group by 表达式中暂不支持包含数组类型。
    • where 表达式中暂不支持包含数组类型。仅允许通过[m] 获取数组中第m个元素的值,暂不支持分片形式。
    • connect by表达式中暂不支持包含数组类型。
    • having 表达式中暂不支持包含数组类型。
    • 多表join时,暂不支持数组类型作为join条件。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论