[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 メーリングリストの案内