PostgreSQLの配列型、簡単なサンプル

テーブルカラムに配列型を使う設計はあまりしない。
CREATE TABLE 文の書き方は、2通りある。
文字型の配列の場合、VARCHAR[] という書き方と '_' アンダーバーをつけて _VARCHAR とする方法

CREATE TABLE foo (
     id INTEGER NOT NULL,
     tname VARCHAR[] NOT NULL,
     CONSTRAINT foo_pkey PRIMARY KEY (id)
)
CREATE TABLE foo (
     id INTEGER NOT NULL,
     tname _VARCHAR NOT NULL,
     CONSTRAINT foo_pkey PRIMARY KEY (id)
)

どちらも同じものを作ってくれる。
INSERT文とかも書き方は、2通りある。

INSERT INTO foo (id, tname)
VALUES(1, '{ "A", "B", "C" }' )
INSERT INTO foo (id, tname)
VALUES(2, ARRAY['D', 'E', 'F'] )

配列の長さを求める時は、array_length(配列名, 次元)

SELECT array_length(tname, 1) FROM foo 

配列インデックス指定で値をセットする時は、先頭が1始まり

UPDATE foo SET 
tname[1] = 'G'
WHERE id = 3

インデックス指定の抽出も同様で、配列数より大きい列番号を指定すると NULLが返る。

SELECT  tname[4] FROM samfoo 

WHERE句の条件で、配列の比較をする時は注意が必要
VARCHAR配列型で、任意の文字列を含む条件の時、

WHERE tname  @> ARRAY['A']  

VARCHAR配列型 tnameで、'A' を含むレコードを条件にする指定は
この書き方だと、
SQLエラー [42883]: ERROR: 演算子が存在しません: character varying @> text
となってしまう。
明示的な、比較値のキャストが必要で、以下のようにしないとならない

WHERE tname  @> ARRAY[ CAST('A' AS varchar) ]