[pgsql-jp: 34416] null値とIF節
Default Non Name
illuminate33 @ hotmail.com
2004年 12月 7日 (火) 20:21:10 JST
またもや性懲りもなく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のストアドを作りたいのですが...。
Postgresqlバージョン7.3以上だと動的SQLが使えるので
text_query:=''SELECT * FROM maintable'';
IF
(X1 IS NULL AND X2 IS NULL AND X3 IS NULL
AND X4 IS NULL AND X5 IS NULL)
THEN
text_query:=text_query||'';'';
ELSE
text_query:=text_query||'' WHERE '';
FOR x IN 1..5 LOOP
SELECT INTO input_fragment name FROM input_tableX where code=x;
SELECT INTO output_fragment name FROM output_tableX where code=x;
IF (output_fragment IS NOT NULL) THEN
text_query:=text_query||''
maintable.''||input_fragment||''=''||output_fragment;
SELECT INTO output_fragment name FROM output_tableX where code=x+1;
IF (output_fragment IS NOT NULL) THEN
text_query:=text_query||'' AND '';
END IF;
END IF;
END LOOP;
text_query:=text_query||'';'';
END IF;
PREPARE loop_select AS text_query
という形にすれば良いのでしょうが、7.2ではどうすればよいのかわかりません。
全ての項目において、nullがあったときに応じてIF分岐などしなければならないの
か、
それとも副問い合わせなどを使ってなんとかならないでしょうか?
http://www.postgresql.jp/document/pg721doc/programmer/plpgsql-statements.html
これを見る限り、7.2.3では動的問合せが有効ですが、しかしPREPAREはないようで。
環境は、Windows 2000で、
$ cygcheck -c cygwin postgresql
Cygwin Package Information
Package Version
cygwin 1.3.12-4
postgresql 7.2.1-2
です。
良い考えがあったら、ぜひお願いします。
pgsql-jp メーリングリストの案内