配列の操作って、作って保存するだけじゃなくて、よく「中身を一個ずつ取り出したい」とか「どんな値が入ってるか分析したい」ってことがあるよね。PostgreSQLには、そういう時に使える便利な関数がいくつか用意されてる。順番に見ていこう!
unnest()関数: 配列のばらし方
unnest()関数は、配列をバラして、それぞれの要素を別々の行にしてくれるんだ。配列のデータをテーブル形式で扱いたい時にめっちゃ便利!
例1: 配列をシンプルにばらす
例えば、学部名が入った配列があるとする:
SELECT ARRAY['コンピュータサイエンス', 'スウガク', 'ブツリ'] AS 学部たち;
この配列の要素を1行ずつ取り出したい時は、unnest()を使う:
SELECT unnest(ARRAY['コンピュータサイエンス', 'スウガク', 'ブツリ']) AS 学部;
結果:
| 学部 |
|---|
| コンピュータサイエンス |
| スウガク |
| ブツリ |
例2: テーブル内の配列をばらす
たとえば、coursesというテーブルがあるとする:
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT,
tags TEXT[]
);
INSERT INTO courses (course_name, tags)
VALUES
('アルゴリズム', ARRAY['プログラミング', 'コンピュータサイエンス']),
('線形代数', ARRAY['スウガク', 'アルゲブラ']),
('基礎物理', ARRAY['ブツリ', 'オウル']);
このテーブルのtags配列から、全部のタグを取り出したい時:
SELECT course_name, unnest(tags) AS tag
FROM courses;
結果:
| course_name | tag |
|---|---|
| アルゴリズム | プログラミング |
| アルゴリズム | コンピュータサイエンス |
| 線形代数 | スウガク |
| 線形代数 | アルゲブラ |
| 基礎物理 | ブツリ |
| 基礎物理 | オウル |
こんな感じで、配列の各要素がテーブルの行になるのが分かるよね。
array_length()関数: 配列のサイズを調べる
配列を扱う時にもう一つ大事なのがarray_length()。これは配列の長さ(要素数)を返してくれる関数だよ。どの次元かも指定できる。
例1: 1次元配列の要素数
例えば、こんな配列:
SELECT ARRAY['リンゴ', 'バナナ', 'オレンジ'] AS フルーツ;
この配列に何個フルーツが入ってるか知りたい時:
SELECT array_length(ARRAY['リンゴ', 'バナナ', 'オレンジ'], 1) AS 長さ;
結果:
| 長さ |
|---|
| 3 |
ここで1は配列の次元を指定してる。PostgreSQLの配列は多次元もできるけど、それはまた別の機会に!
例2: テーブル内の配列の要素数
各コースのタグが何個あるか調べてみよう:
SELECT course_name, array_length(tags, 1) AS タグ数
FROM courses;
結果:
| course_name | タグ数 |
|---|---|
| アルゴリズム | 2 |
| 線形代数 | 2 |
| 基礎物理 | 2 |
「お、2個入ってるね!」って感じで、データ分析がラクになるよ。
array_position()関数: 配列内の値を探す
今度は、配列の中から特定の値を探したい時。array_position()は、指定した値が最初に出てくる位置を返してくれる。
例1: 要素の検索
例えば、こんな配列:
SELECT ARRAY['アカ', 'アオ', 'ミドリ', 'キイロ'] AS 色たち;
「アオ」が何番目か調べたい時:
SELECT array_position(ARRAY['アカ', 'アオ', 'ミドリ', 'キイロ'], 'アオ') AS 位置;
結果:
| 位置 |
|---|
| 2 |
もし要素がなかったら、関数はNULLを返す。試してみよう:
SELECT array_position(ARRAY['アカ', 'アオ', 'ミドリ', 'キイロ'], 'クロ') AS 位置;
結果:
| 位置 |
|---|
| NULL |
例2: テーブル内の配列で検索
どのコースが「コンピュータサイエンス」タグを持ってるか調べたい時、まずは全部の行を見てみよう:
SELECT course_name, array_position(tags, 'コンピュータサイエンス') AS 位置
FROM courses;
結果:
| course_name | 位置 |
|---|---|
| アルゴリズム | 2 |
| 線形代数 | NULL |
| 基礎物理 | NULL |
さらに、タグがある行だけに絞りたい時は:
SELECT course_name
FROM courses
WHERE array_position(tags, 'コンピュータサイエンス') IS NOT NULL;
結果:
| course_name |
|---|
| アルゴリズム |
array_position()は、配列の中からデータをサクッと探せるから、PostgreSQLで配列を使う時は超重要な関数だよ!
関数の実践的な使い方
unnest()— 配列を行に変換したい時に使う。データ分析やレポート作成、タグの扱いに超便利!array_length()— 配列の長さチェックに最適。例えば、データのバリデーションで「配列が空じゃないか」確認したい時に使える。array_position()— 要素の検索にピッタリ。商品カテゴリや学生のプロジェクト参加、説明文のキーワード探しにも使えるよ。
関数利用時のよくあるミス
unnest()は、複数カラムの配列に同時に使うと行数が倍増しちゃう。JOIN LATERALやCROSS JOINで調整できるけど、注意してね。array_length()は、空配列だとNULLを返す。配列が空の可能性がある時は、別でチェックしよう。array_position()は、要素がなければNULLを返す。だから、フィルタではIS NOT NULLを忘れずに。
現場でのリアルな使い方例
PostgreSQLの配列は、ただの理論じゃなくて、実際のプロジェクトでもめっちゃ役立つツールだよ。例えば、ブログ記事ごとにタグのリストを持たせておけば、テーマで記事を絞り込んだり、人気カテゴリのランキングを作ったりも簡単!
それから、ユーザーが複数のコースや商品を選ぶようなサービスでも、好みを配列で持たせておけば、集計や分析がラクチン。
あと、array_length()で「選択肢は最大5個まで」みたいなバリデーションもできるから、データの品質管理にも使えるよ。
GO TO FULL VERSION