📜  PostgreSQL – For 循环

📅  最后修改于: 2022-05-13 01:57:06.040000             🧑  作者: Mango

PostgreSQL – For 循环

PostgreSQL 提供了for循环语句来迭代一系列整数或结果集或动态查询的结果集。 PostgreSQL 中for循环的不同用途如下所述:

1. for 循环遍历整数范围

用于遍历整数范围的 for 循环语句的语法:

[ <

如果我们分析上面的语法:

  • 首先创建一个整数变量loop_cnt ,它只能在循环内部访问。每次迭代后,for 循环将步骤添加到loop_cnt 。但是,当我们使用 reverse 选项时,for 循环会在每次迭代后从loop_cnt中减去 step。
  • 要指定范围的下限和上限,我们使用fromto表达式。在进入循环之前,for 循环会计算这些表达式。
  • by关键字后面的步骤指定迭代步骤,默认值为 1。此步骤表达式仅计算一次。

以下流程图描述了 for 循环语句:

For循环流程图

示例 1:

以下代码使用 for 循环语句从 1 到 10 迭代十多个数字,并在每次迭代中显示它们中的每一个:

do $$
begin
   for cnt in 1..10 loop
    raise notice 'cnt: %', cnt;
   end loop;
end; $$

输出:

示例 2:

以下代码使用 for 循环语句从 10 到 1 迭代十多个数字,并在每次迭代中显示它们中的每一个:

do $$
begin
   for cnt in reverse 10..1 loop
      raise notice 'cnt: %', cnt;
   end loop;
end; $$

输出:

2. for 循环遍历结果集

用于遍历查询结果集的 for 循环语句的语法:

[ <

首先,我们使用以下命令创建一个示例表来执行示例:

CREATE TABLE employees (
  employee_id serial PRIMARY KEY,
  full_name VARCHAR NOT NULL,
  manager_id INT
);

然后我们将数据插入到我们的员工表中,如下所示:

INSERT INTO employees (
  employee_id,
  full_name,
  manager_id
)
VALUES
  (1, 'M.S Dhoni', NULL),
  (2, 'Sachin Tendulkar', 1),
  (3, 'R. Sharma', 1),
  (4, 'S. Raina', 1),
  (5, 'B. Kumar', 1),
  (6, 'Y. Singh', 2),
  (7, 'Virender Sehwag ', 2),
  (8, 'Ajinkya Rahane', 2),
  (9, 'Shikhar Dhawan', 2),
  (10, 'Mohammed Shami', 3),
  (11, 'Shreyas Iyer', 3),
  (12, 'Mayank Agarwal', 3),
  (13, 'K. L. Rahul', 3),
  (14, 'Hardik Pandya', 4),
  (15, 'Dinesh Karthik', 4),
  (16, 'Jasprit Bumrah', 7),
  (17, 'Kuldeep Yadav', 7),
  (18, 'Yuzvendra Chahal', 8),
  (19, 'Rishabh Pant', 8),
  (20, 'Sanju Samson', 8);

表格是:

示例 3:

以下代码使用 for 循环语句遍历最大的 10 个员工 ID:

do
$$
declare
    f record;
begin
    for f in select employee_id, full_name 
           from employees 
           order by employee_id desc, full_name
           limit 10 
    loop 
    raise notice '% - % ', f.employee_id, f.full_name;
    end loop;
end;
$$;

输出:

3. for循环遍历动态查询的结果集

用于遍历动态查询的结果集的 for 循环语句的语法:

[ <

如果我们分析上面的语法:

  • query_expression是一条 SQL 语句。
  • using子句用于传递查询参数。

示例 4:

下面的代码展示了如何使用 for 循环语句来循环动态查询。它有以下两个配置变量:

  • sort_type: 1 按员工编号排序,2 按姓名长度排序
  • rec_count:是要从表中查询的记录数。
do $$
declare
    -- sort by 1: employee_id , 2: length of name 
    sort_type smallint := 1; 
    -- return the number of films
    rec_count int := 10;
    -- use to iterate over the film
    rec record;
    -- dynamic query
    query text;
begin
        
    query := 'select full_name, employee_id from employees ';
    
    if sort_type = 1 then
        query := query || 'order by employee_id desc ';
    elsif sort_type = 2 then
      query := query || 'order by length(full_name) desc ';
    else 
       raise 'invalid sort type %s', sort_type;
    end if;

    query := query || ' limit $1';

    for rec in execute query using rec_count
        loop
         raise notice '% - %', rec.employee_id, rec.full_name;
    end loop;
end;
$$

输出:

如果我们将 sort_type 更改为 2,我们将得到以下输出: