我在PostgreSQL中有一个名为t1
的数据库表,类似于:
名称 | 开始日期 | 结束日期|
---|---|---|
10月18日 | 2018-10-01 | 2018-10-05 |
使用generate_series()
。但是SQL不允许动态数量的结果列。因此,您必须将结果包装在字符串、数组或文档类型中才能使其工作。LATERAL
子查询中ARRAY构造函数的示例-在Postgres 10或更高版本中:
SELECT t1.name, d.date_arr::date[]
FROM t1
LEFT JOIN LATERAL (
SELECT ARRAY(SELECT generate_series(t1.startdate::timestamp
, t1.enddate::timestamp
, interval '1 day'))
) d(date_arr) ON true;
为什么(最好(Postgres 10或更高?
- SELECT子句中多个集合返回函数的预期行为是什么
为什么要转换为timestamp
?
- 在PostgreSQL中生成两个日期之间的时间序列
为什么选择LEFT JOIN .. ON true
?
- LATERAL JOIN和PostgreSQL中的子查询有什么区别
尽管在这种特殊情况下LEFT JOIN
不是必需的(可能是CROSS JOIN
(,因为ARRAY构造函数总是返回一行。
Postgres 9.1
LATERAL
需要Postgres 9.3或更高版本。您可以用相关的子查询替代:
SELECT name
, ARRAY(SELECT generate_series(startdate::timestamp
, enddate::timestamp
, interval '1 day')::date)
FROM t1;
甚至适用于第8.4页:
db<gt;小提琴这里
但可以考虑升级到当前版本。
crosstab()
crosstab()
也无法克服SQL的静态特性。准备好的行类型的解决方法有限。。。
- 使用CASE和GROUP BY动态替代pivot
- PostgreSQL中为交叉表动态生成列
- PostgreSQL交叉表查询