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