plpgsql関数には、record型の変数があります。
my_rec RECORD;
このレコードには任意のテーブルの行が含まれているため、実行される前に列がわかりません。ただし、varcharとして使用できる列の少なくとも1つの名前はあります。
問題は、my_recから特定の列の値を取得するにはどうすればよいですか?
plpgsql関数には、record型の変数があります。
my_rec RECORD;
このレコードには任意のテーブルの行が含まれているため、実行される前に列がわかりません。ただし、varcharとして使用できる列の少なくとも1つの名前はあります。
問題は、my_recから特定の列の値を取得するにはどうすればよいですか?
関数内の動的列を使用hstore
してsを操作するために使用します。record
PL/PgSQL
CREATE EXTENSION hstore;
CREATE OR REPLACE FUNCTION test_fn(col_name text) RETURNS text AS $$
DECLARE
input_row record;
col_value text;
BEGIN
SELECT INTO input_row
*
FROM ( VALUES ('a','b','c',1) ) AS dummyrow(col1,col2,col3,intcol);
SELECT INTO col_value
hstore(input_row) -> col_name;
RETURN col_value;
END;
$$ LANGUAGE 'plpgsql';
hstore
は拡張機能ですが、8.3以降PostgreSQLにバンドルされておりCREATE EXTENSION
、9.1以降を使用してインストールできる拡張機能です。レコードからストアへの変換は、8.4や9.0などからサポートされています。
plpgsqlでこれを行う方法がわかりません。私はあなたのために少しテストを行い、次のような「EXECUTESELECT」ソリューションを機能させようとしました。
EXECUTE 'select $1.' || quote_ident(the_param) USING my_rec INTO my_var;
これは私には機能せず、次のようになります。
could not identify column "{{param_value here}}" in record data type
これは、 plpgsqlでは不可能であるという数年前の非常によく似た質問です。それが示唆しているように、それは他のいくつかの言語で可能であるはずです。トムレーンの答えを引用する:
plpgsqlでそれを行う方法はありません。他のPL(plperl、pltclなど)はplpgsqlほど強く型付けされていないため、これを行うことができます。