トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

7-30 空き番号を取得その3

SQLパズル

以下のテーブルから空き番号を取得する。

No
--
10
15
30

出力結果
空き
----
  11
  12
  13
  14
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29


データ作成スクリプト

create table NoTable3(No) as
select 10 union
select 15 union
select 30;


SQL

--■■■PL/pgSQLを使う方法■■■
CREATE OR REPLACE FUNCTION tableF()
RETURNS SETOF integer AS '
declare
    rec RECORD;
BEGIN
    for rec in select No+1 as staNo,
               Lead(No-1,1,No) over(order by No) as EndNo
                 from NoTable3 order by No Loop
        for i in rec.staNo..rec.EndNo Loop
            RETURN NEXT i;
        end Loop;
    END LOOP;
    RETURN;
END
' LANGUAGE plpgsql;

SELECT * FROM tableF();

--■■■再帰SQLを使う方法■■■
with recursive rec(No,LeadNo) as(
select No+1,LeadNo
  from (select No,Lead(No) over(order by No) as LeadNo
          from NoTable3) a
 where No+1 < LeadNo
union all
select No+1,LeadNo
  from rec
 where No+1 < LeadNo)
select*from rec
order by No;


解説

結果セットを返すPL/pgSQLのサンプルです。

第 38章PL/pgSQL - SQL手続き言語
複数行複数列を返すPL/pgSQL関数 - iakioの日記 - postgresqlグループ

OracleSQLパズル 7-30 空き番号を取得その3