[pgsql-jp: 40402] Re: n行のテーブルより任意の1行を取り出すSQL

あきら akirainfoml @ gmail.com
2010年 9月 16日 (木) 11:12:46 JST


あきらです

> シーケンスの欠番の偏りは気になりますが、tに対してdeleteが走ったりする構造
> でない限り、また何らかの理由で明示的にrollbackさせることを想定した実装でない
> 限り、多くの場合、欠番の発生は一定確率に収まるはずなので、これで大丈夫そうで
> す。そもそも「無作為」が要件ですし…。

すでにある程度解決していると思いますがファンクションを利用して。。。

-- createlang -h 127.0.0.1 -d dbname -U username plpgsql

-- drop function get_random_t_i();
create function get_random_t_i() returns integer as
'
declare
  ret integer;
  max_i integer;
begin
  select max(i) into max_i from t;
  WHILE ret is null LOOP
    select i into ret from t WHERE i = (random()*max_i)::integer;
  END LOOP;
  return ret;
end;
'
language 'plpgsql'
;

select  get_random_t_i();



個人的にはループの内容がnullだったらプログラムの方で再度取得しなおした
方がすっきりしてあとのメンテナンスが楽だなと思います

あきら


pgsql-jp メーリングリストの案内