PostgreSQL中的generate_series函数

PostgreSQL中的generate_series函数

一、简介

PostgreSQL 中有一个很有用处的内置函数generate_series,可以按不同的规则产生一系列的填充数据。

二、语法

函数参数类型返回类型描述
generate_series(start, stop)int 或 bigintsetof int 或 setof bigint(与参数类型相同)生成一个数值序列,从start 到 stop,步进为一
generate_series(start, stop, step)int 或 bigintsetof int 或 setof bigint(与参数类型相同)生成一个数值序列,从start 到 stop,步进为step
generate_series(start, stop, step_interval)timestamp or timestamp with time zonetimestamp 或 timestamp with time zone(same as argument type)生成一个数值序列,从start 到 stop,步进为step

三、例子

1、int类型
  • 不写步进时默认为1

    select generate_series(1,10) as num;
    

    在这里插入图片描述

  • 设置步进为2

    select generate_series(1,10,2) as num;
    

    在这里插入图片描述

  • 如果step 是正数,而start 大于stop,那么返回零行。相反,如果step 是负数,start 小于stop,则返回零行。如果是NULL 输入,也产生零行。step 为零则是一个错误。

    start 大于stop

    yang=# select generate_series(10,5) as num;
    num
    -----
    (0 rows)
    

    start 小于stop,step 是负数

    yang=# select generate_series(1,5,-1) as num;
    num
    -----
    (0 rows)
    

    NULL 输入,也产生零行

    yang=# select generate_series(1,null) as num;
    num
    -----
    (0 rows)
    

    step 为零

    yang=# select generate_series(1,5,0) as num;
    ERROR:  step size cannot equal zero
    
2、时间类型
  • 生成连续日期
    yang=# select generate_series(now(),now()+'8 day','1 day') as num;
               num
    ------------------------------
    2024-05-11 21:42:47.81037+08
    2024-05-12 21:42:47.81037+08
    2024-05-13 21:42:47.81037+08
    2024-05-14 21:42:47.81037+08
    2024-05-15 21:42:47.81037+08
    2024-05-16 21:42:47.81037+08
    2024-05-17 21:42:47.81037+08
    2024-05-18 21:42:47.81037+08
    2024-05-19 21:42:47.81037+08
    (9 rows)
    
  • 生成时间间隔
    yang=# select generate_series(to_date('20240511','yyyymmdd'),to_date('20240512','yyyymmdd'),'5 hour') as num;
               num
    ------------------------
    2024-05-11 00:00:00+08
    2024-05-11 05:00:00+08
    2024-05-11 10:00:00+08
    2024-05-11 15:00:00+08
    2024-05-11 20:00:00+08
    (5 rows)
    

四、总结

PostgreSQL的generate_series函数对生成测试数据,批量更新数据有比较多的应用场景,使用得当可以提高工作效率。

另外IP的序列生成也是PG的一个亮点。

  • 例如:生成一批随机数
    yang=# select floor(random()*10+1) num1,round(random()::numeric,2) num2 from generate_series(1,10);
    num1 | num2
    ------+------
      6 | 0.22
      6 | 0.51
      8 | 0.84
      7 | 0.57
     10 | 0.46
      9 | 0.56
      7 | 0.84
      7 | 0.27
      7 | 0.62
      2 | 0.10
    (10 rows)
    
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值