不同的关系型数据库有不同的方式可以用来生成一个序列,
PostgreSQL使用generate_series函数,可参考https://www.postgresql.org/docs/9.1/static/functions-srf.html
例如,
SELECT * FROM generate_series(2,4);
generate_series
-----------------
2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
-----------------
5
3
1
(3 rows)
Oracle使用connect by函数,可参考http://www.oradev.com/connect_by.html
例如,
select level from dual connect by level<=10;
Trafodion在后续新版本中提供series() UDF来实现类似的功能,在此之前,我们也可以通过手动创建相应的TMUDF来实现。方法如下,
- 准备libseries.so并分发到每个trafodion节点
cp libseries.so /opt/trafodion/
chown trafodion.trafodion libseries.so
pdcp $MY_NODES libseries.so $PWD
- 创建类库
create library series file '/opt/trafodion/libseries.so';
- 创建TMUDF
create table_mapping function series() external name 'SERIES' language cpp library series;
- 测试TMUDF功能
//生成1~10的序列
>>select element from udf(series(1,10));
ELEMENT
--------------------
1
2
3
4
5
6
7
8
9
10
--- 10 row(s) selected.
//生成当月所有日期
>>select cast(date_trunc('MONTH',sysdate) as date) + element days from udf(series(0,cast(cast(dateadd(day,-1,date_trunc('MONTH',add_months(sysdate,1))) as date) - cast(date_trunc('MONTH',sysdate) as date) as int)));
DAYS
----------
2018-09-01
2018-09-02
2018-09-03
2018-09-04
2018-09-05
2018-09-06
2018-09-07
2018-09-08
2018-09-09
2018-09-10
2018-09-11
2018-09-12
2018-09-13
2018-09-14
2018-09-15
2018-09-16
2018-09-17
2018-09-18
2018-09-19
2018-09-20
2018-09-21
2018-09-22
2018-09-23
2018-09-24
2018-09-25
2018-09-26
2018-09-27
2018-09-28
2018-09-29
2018-09-30
--- 30 row(s) selected.