首页 > 数据库 > 国内数据库 > GBase8s 虚拟列详解(一)
GBase8s 虚拟列详解(一)
一、简介
GBase8s 虚拟列定义:虚拟列是指使用表达式或函数进行定义的数据列。逻辑上,表的虚拟列与普通列具有相同的语法含义,但虚拟列的值并不保存在任何物理存储介质上,而是在 SQL 的执行过程中,根据定义虚拟列的表达式或函数进行计算而获得。
要点:
1. 与普通列类似,一般在使用上没有过多区别,只是通过表达式计算
2. 在虚拟列的表达式中,可以包括同表的其他列、常量、 SQL 函数,甚至可以包括一些用户自定义的函数;
3. 只有当查询虚拟列时才能看到该列的值 , 但是 , 这个值不像普通列的值那样永久存储在磁盘上 , 只有当通过动态地一个或一个列表达式被查询时 , 虚拟列的值才被计算。
示例: create table t1 (id int, month_sal decimal(10,2 ) ,total_sal as(month_sal*12));
二、虚拟列语法
column :虚拟列的列名,命名规则和相关约束与 GBase 8s 当前版本的普通列保持一致,不可与该表其它列重名,不可省略;
datatype :虚拟列数据类型,支持当前 8s 版本的标量数据类型,可省略;如省略,虚拟列的数据类型,与定义该虚拟列的表达式或函数的返回值数据类型保持一致。(不支持大对象、 ROW 、集合、 SERIAL 自增类型)
GENERTATED ALWAYS :显式声明虚拟列关键字,可省略;
AS :显式声明虚拟列关键字,不可省略;
column_expression :用于定义虚拟列的列表达式或常量表达式,表达式只能引用当前表中的列,且该表达式具有唯一的返回值;不可省略;虚拟列表达式中不可引用其它虚拟列;
VIRTUAL :显式声明虚拟列关键字,可省略;
三、数据类型和表达式
1. 数据类型
支持字符型、日期型、数值型
不支持大对象、 ROW 、自定义类型、集合类型
不支持 SERIAL 、 SERIAL8 、 BIGSERIAL
2. 列表达式
只能引用当前表的列,且表达式必须具有唯一返回值
支持单列、常量表达式、条件表达式、函数表达式 ……
支持用户自定函数, PACKAGE 中定义的函数
不能引用虚拟列
不支持伪列
不支持聚集函数、 LISTAGG() 、列转行函数
CREATE TABLE sc (stu_id INT primary key, stu_nm VARCHAR2(50), course_id INT,
source decilmal(10,2),
v_source varchar(20) AS (
case when source < 60 then ‘ 不合格 ’
when source >60 ‘ 合格 ’ end) VIRTUAL);
Insert into sc(stu_id,stu_nm,course_id,source)values(1,’ 张三 ’,9001,56);
Insert into sc(stu_id,stu_nm,course_id,source)values(2, ‘ 李思思 ’,9001,80);
select * from sc;
stu_id sut_nm course_id source v_source
1 张三 9001 56 不合格
2 李思思 9001 80 合格
四、 虚拟列使用 DDL
CREATE TABLE 中定义虚拟列
ALTER TABLE ADD Col 新增虚拟列
ALTER TABLE Modify Col 修改虚拟列
可以修改虚拟列数据类型、列表达式
不支持修改虚拟列表达式引用的列
不支持将虚拟列修改为普通列
不支持将普通列修改为虚拟列
ALTER TABLE DROP Col 删除虚拟列
不能直接删除虚拟列引用的列,需先删除虚拟列,再删除指定列
支持 COMMNET 给虚拟列添加注释
虚拟列不支持 DEFAULT 表达式
不支持 CREATE AS SELECT
官网:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980677/viewspace-2768917/ ,如需转载,请注明出处,否则将追究法律责任。