zoukankan      html  css  js  c++  java
  • PostgreSQL的generate_series函数应用

    一、简介

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

    二、语法

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

    三、实例

    3.1) int 类型

    a. 不写步进时默认为1

    复制代码
    david=# select generate_series(1, 10);
     generate_series 
    -----------------
                   1
                   2
                   3
                   4
                   5
                   6
                   7
                   8
                   9
                  10
    (10 rows)
    
    david=# 
    复制代码

    b. 设置步进

    复制代码
    david=# select generate_series(1, 10, 3);
     generate_series 
    -----------------
                   1
                   4
                   7
                  10
    (4 rows)
    
    david=# 
    复制代码

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

    复制代码
    david=# select generate_series(5,1);
     generate_series 
    -----------------
    (0 rows)
    
    david=# 
    复制代码

    NULL inputs

    复制代码
    david=# select generate_series(5,null);
     generate_series 
    -----------------
    (0 rows)
    
    david=#
    复制代码

    step 为零

    david=# select generate_series(5,1,0);
    ERROR:  step size cannot equal zero
    david=#

    start 大于stop,step 是负数

    复制代码
    david=# select generate_series(5,1,-1);
     generate_series 
    -----------------
                   5
                   4
                   3
                   2
                   1
    (5 rows)
    
    david=#
    复制代码

    3.2) 时间类型

    复制代码
    david=# select generate_series(now(), now() + '7 days', '1 day');
            generate_series        
    -------------------------------
     2013-04-03 14:22:26.391852+08
     2013-04-04 14:22:26.391852+08
     2013-04-05 14:22:26.391852+08
     2013-04-06 14:22:26.391852+08
     2013-04-07 14:22:26.391852+08
     2013-04-08 14:22:26.391852+08
     2013-04-09 14:22:26.391852+08
     2013-04-10 14:22:26.391852+08
    (8 rows)
    
    david=#
    复制代码
    复制代码
    david=# select generate_series(to_date('20130403','yyyymmdd'), to_date('20130404','yyyymmdd'), '3 hours');  
        generate_series     
    ------------------------
     2013-04-03 00:00:00+08
     2013-04-03 03:00:00+08
     2013-04-03 06:00:00+08
     2013-04-03 09:00:00+08
     2013-04-03 12:00:00+08
     2013-04-03 15:00:00+08
     2013-04-03 18:00:00+08
     2013-04-03 21:00:00+08
     2013-04-04 00:00:00+08
    (9 rows)
    
    david=#
    复制代码

    3.3) IP类型

    a. 建表

    david=# create table tbl_david(id int, ip_start inet, ip_stop inet);
    CREATE TABLE
    david=#

    b. 插入数据

    复制代码
    david=# insert into tbl_david values (1, '192.168.1.6', '192.168.1.10');   
    INSERT 0 1
    david=# insert into tbl_david values (2, '192.168.2.16', '192.168.2.20');  
    INSERT 0 1
    david=# insert into tbl_david values (3, '192.168.3.116', '192.168.3.120'); 
    INSERT 0 1
    david=#
    复制代码

    c. 查看数据

    复制代码
    david=# select * from tbl_david ;
     id |   ip_start    |    ip_stop    
    ----+---------------+---------------
      1 | 192.168.1.6   | 192.168.1.10
      2 | 192.168.2.16  | 192.168.2.20
      3 | 192.168.3.116 | 192.168.3.120
    (3 rows)
    
    david=#
    复制代码

    d. generate_series 生成序列

    复制代码
    david=# select id, generate_series(0, ip_stop-ip_start)+ip_start as ip_new from tbl_david ;
     id |    ip_new     
    ----+---------------
      1 | 192.168.1.6
      1 | 192.168.1.7
      1 | 192.168.1.8
      1 | 192.168.1.9
      1 | 192.168.1.10
      2 | 192.168.2.16
      2 | 192.168.2.17
      2 | 192.168.2.18
      2 | 192.168.2.19
      2 | 192.168.2.20
      3 | 192.168.3.116
      3 | 192.168.3.117
      3 | 192.168.3.118
      3 | 192.168.3.119
      3 | 192.168.3.120
    (15 rows)
    
    david=#
    复制代码

    四、总结

    PostgreSQL的generate_series函数对生成测试数据,批量更新一定规则的数据有比较多的应用场景,使用得当可提升开发效率,另外IP的序列生成也是PG的一个亮点。

  • 相关阅读:
    MFC tab页面中获到其它页面的数据
    sqlite数据库中"Select * From XXX能查到数据,但是Select DISTINCT group From xxx Order By group却查不出来
    关闭程序出现崩溃(exe 已触发了一个断点及未加载ucrtbased.pdb)
    springboot 通用Mapper使用
    springBoot 发布war包
    springCloud Zuul网关
    springboot hystrix turbine 聚合监控
    springBoot Feign Hystrix Dashboard
    springBoot Ribbon Hystrix Dashboard
    springBoot Feign Hystrix
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/9146223.html
Copyright © 2011-2022 走看看