CodeGym /コース /SQL SELF /配列からデータを取り出す: unnest(), array_length...

配列からデータを取り出す: unnest(), array_length(), array_position()

SQL SELF
レベル 35 , レッスン 2
使用可能

配列の操作って、作って保存するだけじゃなくて、よく「中身を一個ずつ取り出したい」とか「どんな値が入ってるか分析したい」ってことがあるよね。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() — 要素の検索にピッタリ。商品カテゴリや学生のプロジェクト参加、説明文のキーワード探しにも使えるよ。

関数利用時のよくあるミス

  1. unnest()は、複数カラムの配列に同時に使うと行数が倍増しちゃう。JOIN LATERALCROSS JOINで調整できるけど、注意してね。
  2. array_length()は、空配列だとNULLを返す。配列が空の可能性がある時は、別でチェックしよう。
  3. array_position()は、要素がなければNULLを返す。だから、フィルタではIS NOT NULLを忘れずに。

現場でのリアルな使い方例

PostgreSQLの配列は、ただの理論じゃなくて、実際のプロジェクトでもめっちゃ役立つツールだよ。例えば、ブログ記事ごとにタグのリストを持たせておけば、テーマで記事を絞り込んだり、人気カテゴリのランキングを作ったりも簡単!

それから、ユーザーが複数のコースや商品を選ぶようなサービスでも、好みを配列で持たせておけば、集計や分析がラクチン。

あと、array_length()で「選択肢は最大5個まで」みたいなバリデーションもできるから、データの品質管理にも使えるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION