テーブルカラムに配列型を使う設計はあまりしない。
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) ]