[pgsql-jp: 34417] Re: null値とIF 節

ISHIDA Akio iakio @ mono-space.net
2004年 12月 7日 (火) 21:24:29 JST


こんばんは。石田@苫小牧市です。

Default Non Name wrote:
> またもや性懲りもなくplpgsqlで困っています。
> 
> たとえば、table test_table (code integer, a1 varchar, a2 varchar, a3 
> varchar, a4 varchar, a5 varchar, primary key (code));
> で引数が五つ、(X1, X2, X3, X4, X5)
> SELECT * FROM test_table where a1=X1 AND a2=X2 AND a3=X3 AND a4=X4 AND 
> a5=X5;
> 
> という問合せを行いたいとします。ただし、
> 
> 例えばa3がnullの場合、「AND a3=**」の部分を抜いて、
> 
> SELECT * FROM test_table where a1=X1 AND a2=X2 AND a4=X4 AND a5=X5;
> という問合せになるようにplpgsqlのストアドを作りたいのですが...。
(中略)
> という形にすれば良いのでしょうが、7.2ではどうすればよいのかわかりません。
> 全ての項目において、nullがあったときに応じてIF分岐などしなければならないの
> か、
> それとも副問い合わせなどを使ってなんとかならないでしょうか?
> http://www.postgresql.jp/document/pg721doc/programmer/plpgsql-statements.html
> 
> これを見る限り、7.2.3では動的問合せが有効ですが、しかしPREPAREはないようで。

そのURLにもあるように、plpgsqlの動的問合せでSELECT文の結果を取得するには
FOR-IN-EXECUTEを使用します。
ただし、そのSELECT文が返す行をそのplpgsql関数から返したいということ
であれば、7.2.3では出来なかったと思います(plpgsql関数から複数行を
返すことができないため)。

そのかわり、plpgsql関数を使わずに、

SELECT * FROM test_table
 WHERE coalesce(a1, true, a1 = x1)
   AND coalesce(a2, true, a2 = x2)
   ...

のようなSQL一発でいけるんじゃないでしょうか?(試してませんが)

-- 
ISHIDA Akio <iakio @ mono-space.net / ishida @ cycleof5th.com>



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