文字列リテラル、ARRAY[] 型、VARIADIC 関数: それぞれの使い分け
Postgresqlで整数配列をパラメータとして渡す方法
PostgreSQLでは、関数やプロシージャに整数配列をパラメータとして渡すことができます。
方法
以下の2つの方法があります。
ARRAY 型を使用する
CREATE FUNCTION my_function(num_array integer[]) RETURNS void AS $$
BEGIN
-- 配列内の要素を処理
FOREACH num IN ARRAY num_array LOOP
-- 例: 各要素を10倍する
UPDATE my_table SET value = value * 10 WHERE id = num;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT my_function(ARRAY[1, 2, 3]);
unnest 関数を使用する
CREATE FUNCTION my_function(num1 integer, num2 integer, num3 integer) RETURNS void AS $$
BEGIN
-- 個々の要素を処理
UPDATE my_table SET value = value * 10 WHERE id = num1;
UPDATE my_table SET value = value * 10 WHERE id = num2;
UPDATE my_table SET value = value * 10 WHERE id = num3;
END;
$$ LANGUAGE plpgsql;
SELECT my_function(unnest(ARRAY[1, 2, 3]));
- 配列内の要素を個別に処理する必要がある場合は、
unnest
関数を使用する方が効率的です。
- 詳細については、PostgreSQLの公式ドキュメントを参照してください。
補足
- 上記の例では、
my_function
関数は何も返却しません。必要に応じて、RETURN
ステートメントを使用して値を返却することができます。 UPDATE
ステートメントの代わりに、他のSQLステートメントを使用することができます。
-- テーブル作成
CREATE TABLE my_table (
id integer PRIMARY KEY,
value integer
);
-- データ挿入
INSERT INTO my_table (id, value) VALUES (1, 10), (2, 20), (3, 30);
-- 関数作成
CREATE FUNCTION my_function(num_array integer[]) RETURNS void AS $$
BEGIN
-- 配列内の要素を処理
FOREACH num IN ARRAY num_array LOOP
-- 例: 各要素を10倍する
UPDATE my_table SET value = value * 10 WHERE id = num;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- 関数実行
SELECT my_function(ARRAY[1, 2, 3]);
-- 結果確認
SELECT * FROM my_table;
結果
id | value
-- | --
1 | 100
2 | 200
3 | 300
-- テーブル作成
CREATE TABLE my_table (
id integer PRIMARY KEY,
value integer
);
-- データ挿入
INSERT INTO my_table (id, value) VALUES (1, 10), (2, 20), (3, 30);
-- 関数作成
CREATE FUNCTION my_function(num1 integer, num2 integer, num3 integer) RETURNS void AS $$
BEGIN
-- 個々の要素を処理
UPDATE my_table SET value = value * 10 WHERE id = num1;
UPDATE my_table SET value = value * 10 WHERE id = num2;
UPDATE my_table SET value = value * 10 WHERE id = num3;
END;
$$ LANGUAGE plpgsql;
-- 関数実行
SELECT my_function(unnest(ARRAY[1, 2, 3]));
-- 結果確認
SELECT * FROM my_table;
id | value
-- | --
1 | 100
2 | 200
3 | 300
PostgreSQLで整数配列をパラメータとして渡すその他の方法
文字列リテラルを使用する
CREATE FUNCTION my_function(text_array text) RETURNS void AS $$
BEGIN
-- 文字列を配列に変換
DECLARE num_array integer[];
BEGIN
SELECT string_to_array(text_array, ',') INTO num_array;
EXCEPTION WHEN others THEN
RAISE EXCEPTION 'Invalid array format.';
END;
-- 配列内の要素を処理
FOREACH num IN ARRAY num_array LOOP
-- 例: 各要素を10倍する
UPDATE my_table SET value = value * 10 WHERE id = num;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT my_function('{1, 2, 3}');
CREATE FUNCTION my_function(num_array integer[]) RETURNS void AS $$
BEGIN
-- 配列内の要素を処理
FOREACH num IN ARRAY num_array LOOP
-- 例: 各要素を10倍する
UPDATE my_table SET value = value * 10 WHERE id = num;
END LOOP;
END;
$$ LANGUAGE plpgsql;
DECLARE num_array integer[];
BEGIN
ARRAY_APPEND(num_array, 1);
ARRAY_APPEND(num_array, 2);
ARRAY_APPEND(num_array, 3);
END;
SELECT my_function(num_array);
VARIADIC 関数を使用する
CREATE FUNCTION my_function(VARIADIC num_array integer[]) RETURNS void AS $$
BEGIN
-- 配列内の要素を処理
FOREACH num IN ARRAY num_array LOOP
-- 例: 各要素を10倍する
UPDATE my_table SET value = value * 10 WHERE id = num;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT my_function(1, 2, 3);
- 文字列リテラルを使用する方法は、最も簡潔ですが、エラーが発生しやすいです。
ARRAY[]
型を使用する方法は、比較的安全ですが、コードが冗長になることがあります。VARIADIC
関数を使用する方法は、最も柔軟性がありますが、PostgreSQL 9.0以降でのみ使用できます。
arrays postgresql argument-passing