[pgsql-jp: 26510] Re: 空きID の複数検索
sugita @ sra.co.jp
sugita @ sra.co.jp
2002年 6月 27日 (木) 18:10:41 JST
杉田です。
From: "K.Nakamura" <kazz @ emsg.jp>
Subject: [pgsql-jp: 26505] 空きID の複数検索
Date: Thu, 27 Jun 2002 15:03:09 +0900
;;; 以下のようなテーブル構造で
;;; create table abc(
;;; id integer,
;;; nm text
;;; );
;;;
;;; データが
;;; id nm
;;; -----------------
;;; 1 aaa
;;; 4 bbb
;;; 5 ccc
;;; 8 ddd
;;; 10 eee
;;; と、あったときに、1〜10のID中から空いている5個のID(2,3,6,7,9)を
;;; 一度に取得できるSQLを書きたいのですが、I-Netや書籍をあさっても
;;; 書けません。
C でユーザ定義関数を書いてしまえばできそうです。でも、アプリケーション側で結
果的に同じことができるような作りにするのもある気がします。
単に動けばいいというのは、
-- 7.2 用のダミー、7.3 では不用。
CREATE OR REPLACE FUNCTION g(int4, int4) RETURNS SETOF integer AS '
SELECT 0;
' LANGUAGE sql;
CREATE OR REPLACE FUNCTION g(int4, int4) RETURNS SETOF integer AS '
SELECT g($1 - 1, $2) WHERE $1 > $2 UNION SELECT $1;
' language sql;
SELECT * FROM (SELECT g(e, b)
FROM (SELECT min(id) AS b, max(id) AS e FROM abc) AS s)
AS g
EXCEPT SELECT id FROM abc
;
結果は、
g
---
2
3
6
7
9
(5 rows)
Kenji Sugita
sugita @ sra.co.jp
pgsql-jp メーリングリストの案内