トップページに戻る
次の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;
解説