Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

配列カラムでClickHouseテーブルをフィルタリングする方法

はじめに

ClickHouseのテーブルを配列カラムで絞り込むのは一般的な操作であり、配列カラムを扱うための関数も数多く用意されています。

この記事では、配列カラムでテーブルを絞り込む方法に焦点を当てます。なお、以下のビデオでは、配列に関連するそのほかの多くの関数も紹介しています。

ここでは、それぞれ文字列の配列と整数の配列を含む 2 つのカラム tags_stringtags_int を持つテーブルを例として使用します。

  • サンプルのデータベースとテーブルを作成します。
CREATE DATABASE db1;
  • サンプルテーブルを作成する
CREATE TABLE db1.tags_table
(
    `id` UInt64,
    `tags_string` Array(String),
    `tags_int` Array(UInt64),
)
ENGINE = MergeTree
ORDER BY id;
  • テーブルにサンプルデータを挿入します。
INSERT INTO db1.tags_table VALUES (1, ['tag1', 'tag2', 'tag3'], [1, 2, 3]), (2, ['tag2', 'tag3', 'tag4'], [2, 3, 4]), (3, ['tag1', 'tag3', 'tag5'], [1, 3, 5]);

has(arr, elem) 関数を使用して、arr 配列に elem 要素を含む行を返すようにテーブルを絞り込みます。

tags_string 配列に tag1 要素を含む行を返すように、テーブルを絞り込みます。

SELECT * FROM db1.tags_table WHERE has(tags_string, 'tag1');
┌─id─┬─tags_string────────────┬─tags_int─┐
│  1 │ ['tag1','tag2','tag3'] │ [1,2,3]  │
│  3 │ ['tag1','tag3','tag5'] │ [1,3,5]  │
└────┴────────────────────────┴──────────┘

hasAll(arr, elems) 関数を使用して、elems 配列のすべての要素が arr 配列に含まれる行を返します。

テーブルを絞り込み、tags_string 配列のすべての要素が ['tag1', 'tag2'] 配列に含まれる行を返します。

SELECT * FROM db1.tags_table WHERE hasAll(tags_string, ['tag1', 'tag2']);
┌─id─┬─tags_string────────────┬─tags_int─┐
│  1 │ ['tag1','tag2','tag3'] │ [1,2,3]  │
└────┴────────────────────────┴──────────┘

hasAny(arr, elems) 関数を使用して、elems 配列の少なくとも1つの要素が arr 配列に含まれる行を返します。

table を絞り込み、tags_string 配列の少なくとも1つの要素が ['tag1', 'tag2'] 配列に含まれる行を返します。

SELECT * FROM db1.tags_table WHERE hasAny(tags_string, ['tag1', 'tag2']);
┌─id─┬─tags_string────────────┬─tags_int─┐
│  1 │ ['tag1','tag2','tag3'] │ [1,2,3]  │
│  2 │ ['tag2','tag3','tag4'] │ [2,3,4]  │
│  3 │ ['tag1','tag3','tag5'] │ [1,3,5]  │
└────┴────────────────────────┴──────────┘

arrayExists(lambda, arr) 関数を使うと、ラムダ関数でテーブルをフィルタできます。

tags_int Array 内の少なくとも 1 つの要素が 3 より大きい行を返すように、テーブルをフィルタします。

SELECT * FROM db1.tags_table WHERE arrayExists(x -> x > 3, tags_int);
┌─id─┬─tags_string────────────┬─tags_int─┐
│  2 │ ['tag2','tag3','tag4'] │ [2,3,4]  │
│  3 │ ['tag1','tag3','tag5'] │ [1,3,5]  │
└────┴────────────────────────┴──────────┘
Navigation