今日はちょっとだけ配列について話すよ。配列はPostgreSQLの強力なツールの一つで、同じ型の値のリストを1つのカラムに保存できるんだ。もっと詳しい話は次のレベルでやるから、今回は基本だけね。
「配列」と聞くと、すぐにリストを思い出すよね。買い物に行く前にリストを書くときみたいな感じ。例えば:りんご、バナナ、牛乳、パン。PostgreSQLの配列は、こういうリストのイメージで、1つのフィールドに複数の値を保存できるんだ。しかも全部同じデータ型じゃないとダメ。例えば、数字の配列、テキストの配列、日付の配列とかね。
いくつか例を挙げてみるよ。
数字の配列:
{1, 2, 3, 4}
文字列の配列:
{"apple", "banana", "cherry"}
日付の配列:
{2024-10-01, 2024-10-02, 2024-10-03}
配列を使うと、たくさんの値を1つのフィールドにまとめて保存できるから、テーブルのスペースも節約できるし、クエリも柔軟になるよ。
なんで配列が必要なの?主なメリット
データをコンパクトに保存: 複数の値を1つのフィールドに保存できる。特に、論理的に関連してるデータに便利。例えば、記事のタグリストとか、学生の成績リストとか。タグ2つのために別テーブル作る?
取り出しがラク: 配列なら1つのフィールドからリスト全体を一気に取り出せるし、配列の要素ごとに操作も簡単。
パフォーマンス: 場合によっては、関連データのために追加テーブルを作らなくて済むから、DB設計がシンプルになるし、開発も早くなる。これは嬉しいよね。
PostgreSQLで配列をどう使う?
SELECTで配列を作る
配列を作るにはARRAY[]コンストラクタを使うよ。例えば:
-- 数字の配列の例
SELECT ARRAY[1, 2, 3, 4];
-- 文字列の配列の例
SELECT ARRAY['apple', 'banana', 'cherry'];
めっちゃ簡単でしょ。じゃあ、テーブルを作って実際に何か選んでみよう。
配列付きテーブルの作成
まずは、カラムの1つが配列になってるテーブルを作るよ。
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {数学,物理} |
| 2 | Maria | {化学,生物,英語} |
| 3 | Peter | {情報科学} |
どんな感じになったか見てみよう:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {数学,物理} |
| 2 | Maria | {化学,生物,英語} |
| 3 | Peter | {情報科学} |
配列からデータを取り出す
配列からデータを取り出すために、PostgreSQLはいくつかの関数や演算子を用意してるよ。
配列の要素を取り出す
配列の要素をインデックスで取り出すには、角カッコ[]を使うよ。注意:インデックスは1から始まる(PythonやJavaScriptみたいに0からじゃないよ)。
-- 各学生の最初の科目を取得
SELECT name, subjects[1] AS 最初の科目 FROM students;
結果はこんな感じ:
| name | 最初の科目 |
|---|---|
| Alex | 数学 |
| Maria | 化学 |
| Peter | 情報科学 |
配列全体を取り出す
配列の全要素を取り出すには、普通にSELECTを使うだけ:
SELECT name, subjects FROM students;
配列内の値を検索する
たまに、配列が特定の値を含んでるか調べたいときがあるよね。そのときはANY演算子を使うよ。
-- 「数学」を勉強してる学生を選ぶ
SELECT name
FROM students
WHERE '数学' = ANY(subjects);
クエリの結果:
| name |
|---|
| Alex |
PostgreSQLには配列操作用の関数や演算子がめっちゃたくさんあるけど、それはまた次のレベルで教えるね :P
配列でよくあるミス
インデックスの0と1を混同しがち。
PostgreSQLの配列は1から始まるよ。PythonやJavaScriptに慣れてると、ここで混乱しやすい。
空の配列。
空の配列{}とNULLはPostgreSQLでは別物。配列を比較するときは、この違いに注意してね。
大きな配列の扱い。
めっちゃ大量のデータを配列に入れると、クエリの処理が遅くなることがある。配列は小さいデータ量に使うのがオススメ。
GO TO FULL VERSION