0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Postgresで配列.EXTENDを使いたい

0
Posted at

PostgresqlでOracleのような
配列.EXTENDを使用して配列の長さを増やしたい場合

まずOracleでは

array.EXTEND;

のように書くことで配列に要素を一つ足すことができる

イメージで言うと
元々 [1][2][3][4]
という四つの要素が入る予定だった場所に
[1][2][3][4][5]←new
もう一つ要素が入る場所を後付けするようなイメージ

Postgresqlの配列はそもそも可変長のため要素は追加すればするほど伸びていく
Oracleのように要素を追加したい場合にまず要素が入る箱を作るという準備段階が必要でなく
要素を足せば勝手に箱も追加されると思ってもらえばいい

--文字列を追加する場合
SELECT array_append(array, 'addtest');

--複数の文字列を追加する場合
SELECT array_cat(array, ARRAY['TEST1', 'TEST2']);

では特定の位置に配列を追加する場合はどうするのか

postgresqlは配列のインデックスを直接指定して拡張ができるため
例えば配列の4つ目のみ値を入れたい
(前3つはNULLとして手入力を必要とするcsvの出力の時など)
場合

SELECT array_fill(NULL, ARRAY[3]) || ARRAY['2026-01-01'];

上記を実行した場合
{NULL,NULL,NULL,2026-01-01}
というような配列が完成する

使わないようで意外と使うので意外と便利
参照:https://www.postgresql.jp/docs/9.6/functions-array.html

ではOracleと同じ動きをどうしてもしたい場合はどうするか
(一度箱を作るという動作からしたい場合)
関数を先に作る必要がある

CREATE OR REPLACE FUNCTION oracle_extend(exarray)
RETURNS exarray
AS $$
DECLARE
    result exarray;
BEGIN
    result := $1 || NULL; --ここで配列にNULLを追加する
    RETURN result;
END;
$$ LANGUAGE plpgsql;

このような関数を使って実行した場合

--実行
SELECT array_extend(ARRAY['A1','B2']);

--実行結果
{A,B,NULL}

といったように3要素目を追加することができる

先ほど紹介したarray_fillなどを使うことで
よりOracleらしい動きの再現はできるのだが、
個人的にはNULLを追加するところまで覚えていれば十分かなと考える

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?