[pgsql-jp: 34460] coalesce

CM illuminate33 @ hotmail.com
2004年 12月 9日 (木) 22:45:44 JST


石田さん、ありがとうございます。
coalesceは使いませんでしたが、シンプルにcaseでなんとかなりました。


> たとえば、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のストアドを作りたいのですが...。
>
> Postgresqlバージョン7.3以上だと動的SQLが使えるので
>
<snip>
>
> という形にすれば良いのでしょうが、7.2ではどうすればよいのかわかりません。
> 全ての項目において、nullがあったときに応じてIF分岐などしなければならないの
> か、
> それとも副問い合わせなどを使ってなんとかならないでしょうか?
>
http://www.postgresql.jp/document/pg721doc/programmer/plpgsql-statements.html
>
> これを見る限り、7.2.3では動的問合せが有効ですが、しかしPREPAREはないよう
で。
>
>
> こんばんは。石田@苫小牧市です。
>
> 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一発でいけるんじゃないでしょうか?(試してませんが)
>



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