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