0Pricing
SQL Academy · レッスン

配列内部を検索する

ANY、包含、重複判定の演算子を学びます。

「配列内部を検索する」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

配列による複数の値の格納

PostgreSQL では、配列カラムによって1つのセルに複数の値を格納できます。配列内を検索する前に、まず配列がどのようなものかを確認しておきましょう。

次のクエリでは、各商品が複数のカテゴリに属することができ、それらを text 配列として格納するテーブルを作成します。

CREATE TABLE products (
  id      SERIAL PRIMARY KEY,
  name    TEXT,
  tags    TEXT[]
);

INSERT INTO products (name, tags) VALUES
  ('Laptop',     ARRAY['electronics', 'computers', 'sale']),
  ('T-Shirt',    ARRAY['clothing', 'summer', 'sale']),
  ('Coffee Mug', ARRAY['kitchen', 'gifts']),
  ('Headphones', ARRAY['electronics', 'audio']),
  ('Notebook',   ARRAY['stationery', 'office']);

ANY による所属確認

ANY 演算子を使用すると、値が配列内のどこかに存在するかどうかを確認できます。構文は value = ANY(array_column) です。

このクエリでは、electronics のタグが付いたすべての商品を検索します。

SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);

ANY はテキスト専用ではありません

ANY は、等価性をサポートする任意のデータ型で使用できます。次の例では、スコアを整数配列として格納するテーブルを使用します。クエリでは、少なくとも1つのテストで満点の 100 点を取った学生を取得します。

CREATE TABLE students (
  student TEXT,
  scores  INT[]
);

INSERT INTO students VALUES
  ('Alice', ARRAY[88, 95, 100]),
  ('Bob',   ARRAY[70, 80, 90]),
  ('Carol', ARRAY[100, 100, 99]);

SELECT student, scores
FROM students
WHERE 100 = ANY(scores);

NOT + ANY による行の除外

値が配列内に存在しない行を検索するには、NOT と ANY を組み合わせます。value <> ANY(arr) は別の意味になる点に注意してください。これはいずれかの要素が異なれば true になり、ほとんどの場合 true になります。

確実に除外を確認するには、NOT (value = ANY(arr)) を使用してください。

-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));

包含演算子 @>

@> 演算子は、一方の配列にもう一方の配列のすべての要素が含まれているかどうかを確認します。「左側の配列に右側に列挙されたすべての要素が含まれているか」と考えると分かりやすいでしょう。

このクエリでは、electronics タグと sale タグの両方が付いた商品を検索します。

SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];

被包含演算子 <@

<@ 演算子は @> の逆です。左側の配列全体が右側の配列に含まれているかどうかを確認します。

このクエリでは、タグのリスト全体が electronics, computers, sale の集合の部分集合になっている商品を検索します。

SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];

重なり演算子 &&

&& 演算子は、2つの配列が少なくとも1つの共通要素を持つ場合に true を返します。2つのリストに共通するものがあるかどうかを確認する、配列版の演算子です。

次のクエリでは、指定した買い物リストと少なくとも1つのタグが共通する商品を検索します。

SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];

重なりと包含の違い

@> と && は混同しやすい演算子です。違いを明確に比較してみましょう。

  • tags @> ARRAY['a','b'] — その行には 'a' と 'b' の両方が必要です。
  • tags && ARRAY['a','b'] — その行には 'a' または 'b' の少なくとも一方が必要です。
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];

-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];

array_length によるサイズの絞り込み

配列に一定数の要素が含まれる行を検索したい場合があります。array_length(arr, 1) は、第1次元の要素数を返します。

このクエリでは、タグがちょうど3つある商品を検索します。

SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;

配列検索と他の条件の組み合わせ

配列演算子は通常の SQL 条件と組み合わせて使用できます。AND、OR、その他の WHERE 句の述語と組み合わせることで、正確な絞り込み条件を作成できます。

-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
  AND name < 'N'
ORDER BY name;

高速化のための配列へのインデックス作成

大規模なテーブルでは、インデックスがないと配列検索が遅くなることがあります。PostgreSQL の GIN(Generalized Inverted Index)インデックスは配列カラム向けに設計されており、@>、<@、&& 演算子を効率的にサポートします。

ANY は GIN インデックスを直接使用しませんが、重なり演算子と包含演算子は使用します。

-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);

-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];

理解度チェック:配列演算子

PostgreSQL の配列検索演算子についての理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、PostgreSQL の配列内を検索する3つの基本的な方法を学びました。

  • = ANY(arr) — 単一の値が配列内のどこかに存在するかどうかを確認します。
  • @>(包含)— 配列に指定したすべての要素が含まれているかどうかを確認します。
  • &&(重なり)— 配列が別の配列と少なくとも1つの要素を共有しているかどうかを確認します。

また、逆方向の包含確認に使用する <@、サイズによる絞り込みに使用する array_length、大規模なデータセットで配列検索を高速化する GIN インデックスについても学びました。これらの演算子を標準的な WHERE 条件と組み合わせることで、複数の値を持つデータを正確かつ柔軟に扱えます。

よくある質問

「配列内部を検索する」レッスンは無料ですか?

はい。「配列内部を検索する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「配列内部を検索する」で何を学びますか?

ANY、包含、重複判定の演算子を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「配列内部を検索する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 配列型カラムの基本
  2. 配列内部を検索する
  3. UNNESTと集約
  4. 配列と正規化テーブル
← SQL Academyに戻る