Skip to content

Latest commit

 

History

History
73 lines (45 loc) · 3.2 KB

20221026_02.md

File metadata and controls

73 lines (45 loc) · 3.2 KB

DuckDB 虚拟列 - GENERATED ALWAYS AS () VIRTUAL

作者

digoal

日期

2022-10-26

标签

PostgreSQL , GENERATED ALWAYS AS , VIRTUAL , STORED


背景

在表里面存储年龄是一件很尴尬的事情, 因为每年都会增长. 需要修改, 所以可以存储为出生日期, 然后使用虚拟列来保存年龄.

GENERATED ALWAYS AS自动产生value的列, 可以使用GENERATED ALWAYS AS语法, 标准情况支持2种情况:

  • STORED. 存储自动产生的值(insert,update,drop依赖值时,自动更新对应自动产生值)
  • VIRTUAL. 不存储值, 查询到这个列时自动计算, 所以叫虚拟列.

DuckDB 只支持virtual 虚拟列.

例子:

D create table t (id int, birthday date, age int GENERATED ALWAYS AS ((current_date-birthday)/365.25+1) virtual);  
D select current_date;  
┌─────────────────────┐  
│ main.current_date() │  
├─────────────────────┤  
│ 2022-10-26          │  
└─────────────────────┘  
D insert into t values (1, '1988-01-01');  
D insert into t values (2, '2022-10-26');  
D insert into t values (3, '2022-09-26');  
D select * from t;  
┌────┬────────────┬─────┐  
│ id │  birthday  │ age │  
├────┼────────────┼─────┤  
│ 1  │ 1988-01-01 │ 35  │  
│ 2  │ 2022-10-26 │ 1   │  
│ 3  │ 2022-09-26 │ 1   │  
└────┴────────────┴─────┘  

参考

https://duckdb.org/docs/sql/statements/create_table

digoal's wechat