VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

ROWNUM(offset)自定义变量

功能描述

在MySQL兼容模式下,Vastbase G100支持用户自定义rownum变量用来识别获取行号。

其实现逻辑为通过赋值语句实现变量值的累加,从而达到递增行号的目的。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
  • 仅Vastbase G100 V2.2 Build 10(Patch No.12)及以后版本支持此功能。
  • 使用该功能需要设置GUC参数enable_set_variable_b_format为on。
  • rownum暂不能充当其它语法成分,仅作为变量/变量别名使用。因此用户也可自定义任意变量名实现此用法。
  • 用户自定义变量@xxx不支持在以下情况中使用:
    • 聚合查询中,包括select子句和group by子句中。
    • order by子句中。
    • UNION/INTERSECT/EXCEPTION等复合查询中。

语法格式

@rownum 为会话自定义变量
@rownum := 0 确定初始值
@rownum := @rownum +1 变量自增

参数说明

rownum

变量名/变量别名。用户也可以自定义其名称。

示例

1、创建并切换至兼容模式为B的数据库下。

create database testdb_1100915 dbcompatibility 'B';
\c testdb_1100915;

2、设置GUC参数enable_set_variable_b_format为on。

set enable_set_variable_b_format to on;

3、创建测试表并插入数据。

CREATE TABLE tb_1101383 (
depname varchar,
empno bigint,
salary int,
enroll_date date
);

INSERT INTO tb_1101383 VALUES
('develop', 10, 5200, '2007-08-01'),
('sales', 1, 5000, '2006-10-01'),
('personnel', 5, 3500, '2007-12-10'),
('sales', 4, 4800, '2007-08-08'),
('personnel', 2, 3900, '2006-12-23'),
('develop', 7, 4200, '2008-01-01');

4、自定义用户变量,识别获取行号。

  • 自定义变量rownum,令其自增得到行号,并打印结果。

      select @rownum:=@rownum+1 as rownum,b.* from (select @rownum:=0)r,tb_1101383 b;
    

    返回结果为:

      rownum |  depname  | empno | salary | enroll_date
      --------+-----------+-------+--------+-------------
            1 | develop   |    10 |   5200 | 2007-08-01
            2 | sales     |     1 |   5000 | 2006-10-01
            3 | personnel |     5 |   3500 | 2007-12-10
            4 | sales     |     4 |   4800 | 2007-08-08
            5 | personnel |     2 |   3900 | 2006-12-23
            6 | develop   |     7 |   4200 | 2008-01-01
      (6 rows)
    
  • 自定义变量a1,令其自增得到行号,并打印结果。

      select @a1:=@a1+1 as rownum,b.* from (select @a1:=0)r,tb_1101383 b;
    

    返回结果为:

      rownum |  depname  | empno | salary | enroll_date
      --------+-----------+-------+--------+-------------
            1 | develop   |    10 |   5200 | 2007-08-01
            2 | sales     |     1 |   5000 | 2006-10-01
            3 | personnel |     5 |   3500 | 2007-12-10
            4 | sales     |     4 |   4800 | 2007-08-08
            5 | personnel |     2 |   3900 | 2006-12-23
            6 | develop   |     7 |   4200 | 2008-01-01
      (6 rows)
    
  • 自定义变量rownum,令其自增得到行号。根据enroll_date字段进行分组查询,并打印行号小于3的结果(降序排列)。

      select b.enroll_date,b.rownum from (select (@rownum:=@rownum+1) AS rownum,td.* from tb_1101383 td,(select @rownum:=0)r where td.enroll_date<'2008-01-01' and td.depname='sales' order by td.enroll_date desc)b where b.rownum<3;
    

    返回结果为:

      enroll_date | rownum
      -------------+--------
      2007-08-08  |      2
      2006-10-01  |      1
      (2 rows)