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