特定于PostgreSQL
generate_series()
生成一个集合,因此您不仅可以在from
子句中使用它,还可以在可能出现集合的任何地方使用它:
psql=# select generate_series(10, 20, 3);
generate_series
-----------------
10
13
16
19
(4 rows)
您还可以直接在集合上执行操作:
psql=# select 2000 + generate_series(10, 20, 3) * 2;
?column?
----------
2020
2026
2032
2038
(4 rows)
如果多个集合的长度相同,则可以并行遍历它们:
psql=# select generate_series(1, 3), generate_series(4, 6);
generate_series | generate_series
-----------------+-----------------
1 | 4
2 | 5
3 | 6
(3 rows)
对于具有不同长度的集合,将生成笛卡尔乘积:
psql=# select generate_series(1, 3), generate_series(4, 5);
generate_series | generate_series
-----------------+-----------------
1 | 4
2 | 5
3 | 4
1 | 5
2 | 4
3 | 5
(6 rows)
但是,如果在from
子句中使用它们,则也将获得相同长度集的笛卡尔积:
psql=# select * from generate_series(1, 2), generate_series(3, 4) second;
generate_series | second
-----------------+--------
1 | 3
1 | 4
2 | 3
2 | 4
(4 rows)
它还可以生成一组时间戳。例如,您出生于2000-06-30,想知道您在哪个年份庆祝周末生日:
psql=# select to_char(generate_series, 'YYYY - Day') from generate_series('2000-06-30', current_date, interval '1 year') where to_char(generate_series, 'D') in ('1', '7');
to_char
------------------
2001 - Saturday
2002 - Sunday
2007 - Saturday
2012 - Saturday
2013 - Sunday
(5 rows)