🍔

Spannerで配列(ARRAY型)カラムをWHERE句で絞り込む

に公開

はじめに

Cloud Spannerでは、カラムにARRAY型(配列)を持たせることができます。本記事では、ARRAY型カラムの基本、WHERE句での検索方法、配列の操作方法について解説します。

ARRAY型カラムの作成例

まず、配列型カラムを持つテーブルを作成します。例えば、ユーザーが複数のタグを持つ場合、以下のようなテーブル定義になります。

CREATE TABLE UserTags (
  UserID STRING(36) NOT NULL,
  Tags ARRAY<STRING(32)>
) PRIMARY KEY(UserID);

サンプルデータの挿入

INSERT INTO UserTags (UserID, Tags) VALUES
  (GENERATE_UUID(), ['google cloud', 'cloud', 'database']),
  (GENERATE_UUID(), ['aws', 'cloud']),
  (GENERATE_UUID(), ['azure']),
  (GENERATE_UUID(), []),
  (GENERATE_UUID(), ['google cloud', 'devops']);

WHERE句でARRAY型カラムを絞り込む

配列に特定の値が含まれているかを検索

UNNEST関数を使うことで、配列の中身を1行ずつ展開し、特定の値が含まれているかを検索できます。

SELECT
  UserID,
  Tags
FROM
  UserTags
WHERE
  'google cloud' IN UNNEST(Tags);

このクエリは、Tags配列に'google cloud'という値が含まれているユーザーのみを抽出します。

配列が複数の値をすべて含むかを検索

複数の値がすべて含まれているユーザーを検索したい場合は、以下のように書きます。

SELECT
  UserID,
  Tags
FROM
  UserTags
WHERE
  'google cloud' IN UNNEST(Tags)
  AND 'cloud' IN UNNEST(Tags);

配列が空かどうかを判定

配列が空かどうかは、ARRAY_LENGTH関数で判定できます。

SELECT
  UserID
FROM
  UserTags
WHERE
  ARRAY_LENGTH(Tags) = 0;

配列の操作

配列の要素を文字列として連結

ARRAY_TO_STRING関数を使うと、配列の要素を区切り文字で連結できます。

SELECT
  UserID,
  ARRAY_TO_STRING(Tags, ',') AS TagsStr
FROM
  UserTags;

配列同士の結合

ARRAY_CONCAT関数で複数の配列を結合できます。

SELECT
  ARRAY_CONCAT([1, 2], [3, 4]) AS result;

注意事項

  • ARRAY型カラムにはインデックスを作成できません。
  • 配列の値で効率的に検索したい場合は、テーブルを正規化(1行1タグの形式)し、スカラー型カラムにインデックスを貼る必要があります。

まとめ

SpannerのARRAY型カラムは、柔軟なデータ設計や効率的な検索を実現できます。UNNESTINARRAY_TO_STRINGなどの関数を活用することで、配列の中身を自在に検索・操作できます。
より詳細な情報は公式ドキュメントもご参照ください。


参考:Work with arrays in GoogleSQL

Discussion