Skip to main content
パイプ演算子を使用すると、GoogleSQL のパイプ構文と同様に、クエリを上から下へ読める変換の線形チェーンとして記述できます。
任意の SELECT クエリの後に、パイプ演算子を連鎖させることができます。各演算子は |> トークンで始まり、直前のクエリの結果を入力として受け取り、さらに1つの変換を適用します。各演算子内では、通常の ClickHouse 構文を使用します。 パイプ演算子は構文拡張です。各演算子は直前のクエリをサブクエリでラップするため、生成される AST はネストされたサブクエリで記述した同等のクエリの AST と同じになります。したがって、上記のクエリは次と同等です。

FROM クエリ

クエリは FROM 句から開始でき、このようなクエリでは SELECT 句は任意です。SELECT 句を省略した場合、SELECT * が記述されているものとしてクエリが実行されます。
テーブルの別名は、通常の SELECT クエリの FROM 句と同様に、AS キーワードありでもなしでも記述できます: FROM orders o WHERE o.amount > 100。唯一の例外は、select という単語だけを別名として記述する場合です。テーブルの後に select を記述すると、別名ではなく明示的な SELECT 句の開始として扱われます。select という名前のテーブル自体は影響を受けず、独自の別名を保持できます: FROM select s WHERE s.id = 1 最後のテーブルのサンプルオフセットがクエリレベルの OFFSET とも解釈できる場合、SELECT 句は省略できません。これは、FROM t SAMPLE 1/10 OFFSET 5 では OFFSETSAMPLE に属する一方、FROM t SAMPLE 1/10 SELECT * OFFSET 5 ではクエリレベルの OFFSET となるためです。両者を区別するには、明示的な SELECT が必要です。クエリレベルの OFFSET の前に置けない句でクエリが続く場合は曖昧さがないため、通常どおり SELECT 句は任意です: FROM t SAMPLE 1/10 OFFSET 5 WHERE x > 0, FROM t SAMPLE 1/10 OFFSET 5 JOIN dim USING (id)

演算子

WHERE

|> WHERE condition は入力行をフィルタリングします。集約の後に適用した場合は、HAVING と同様に機能します。

SELECT

|> SELECT [DISTINCT] expr1 [AS alias1], ... は、指定した式のみを出力カラムとして残します。
通常のクエリの SELECT 句と同じ位置で、式リストの末尾にカンマを付けることができます。この場合、カンマの後にはクエリの終端または次の |> 演算子を続けられます: FROM orders |> SELECT customer, amount, |> LIMIT 1。同様のことが EXTEND 演算子および AGGREGATE 演算子にも当てはまります。

EXTEND

|> EXTEND expr1 [AS alias1], ... は、指定した式を入力カラムに追加します。これは SELECT *, expr1 AS alias1, ... と同等です。

SET

|> SET column1 = expr1, ... は、指定したカラムの値を置き換えます。これは SELECT * REPLACE (expr1 AS column1, ...) と同等です。

DROP

|> DROP column1, ... は、指定したカラムを削除します。これは SELECT * EXCEPT (column1, ...) と同等です。

AS

|> AS alias は次の演算子の入力に別名を付け、その演算子内から参照できるようにします。主に JOIN で使用します:

AGGREGATE

|> AGGREGATE agg1 [AS alias1], ... [GROUP BY expr1 [AS alias1], ...] は入力行を集計します。出力カラムは、グループ化に使用したカラムの後に集計カラムが続きます。GROUP BY を指定しない場合、入力全体が1行に集計されます。

DISTINCT

|> DISTINCT は重複行を除外します。これは SELECT DISTINCT * と同等です。

ORDER BY

|> ORDER BY expr1 [ASC/DESC], ... は入力行をソートします。ORDER BY ALLWITH FILLINTERPOLATE を含め、ORDER BY 句の完全な構文がサポートされています。

LIMIT と OFFSET

|> LIMIT length [OFFSET offset] および |> OFFSET offset は、返される行数を制限します。

JOIN と ARRAY JOIN

|> [GLOBAL] [ANY/ALL/ASOF/SEMI/ANTI] [INNER/LEFT/RIGHT/FULL/CROSS] JOIN table [ON expr | USING (columns)] は、入力を別のテーブル、サブクエリ、またはテーブル関数と結合します。すべての種類の JOIN および ARRAY JOIN がサポートされています。FROM 句と同様に、1 つの演算子に複数の JOIN を含めることができます。
各演算子はそれぞれ新しいサブクエリのスコープとなるため、テーブル別名は同じ演算子内 (ON 条件内) でのみ参照できます。後続の演算子からは、SELECT * の後と同様に、JOIN 結果の結合後のカラムを参照できます。 クロス JOIN のカンマ表記もサポートされており、演算子への入力が左辺になります: FROM customers |> AS c |> , orders。ほかの JOIN と同様に、joined_subquery_requires_alias 設定が有効な場合は、入力に別名が必要です (デフォルトで有効です) 。 通常のクエリの FROM 句と同様に、ARRAY JOIN の直後ではカンマによるクロス JOIN はサポートされません。ARRAY JOIN の直後のカンマは、常にその式リストの一部として解釈されます。

UNION、INTERSECT、EXCEPT

|> UNION [ALL/DISTINCT] (query1) [, (query2), ...]|> INTERSECT [ALL/DISTINCT] ...|> EXCEPT [ALL/DISTINCT] ... は、入力と他のクエリの結果を結合します。
オペランドを囲む括弧は単一のクエリでは任意ですが、集合演算の後に別のパイプ演算子でチェーンを続ける場合は必須です。そうしないと、次の演算子が最後のオペランドに適用されるのか、結果全体に適用されるのかが不明確になります。

注記

  • クエリの WITH 句は、スカラー別名と CTE のいずれについても、後続するすべてのパイプ演算子で引き続き可視です: WITH 10 AS threshold FROM t |> WHERE x < threshold
  • INSERT ... SELECT では、INSERT の前に記述した WITH 句は、生成される最も外側の SELECT に付加されます。手書きのネストされたサブクエリの場合と同様に、解釈時には enable_global_with_statement 設定 (デフォルトで有効) を介して内側のパイプステージにも適用されます。この設定が無効な場合、INSERT スコープの WITH に含まれる別名と CTE は、手書きのサブクエリ内で可視にならないのと同様に、パイプステージ内でも可視になりません。
  • 他の SELECT クエリと同様に、パイプ演算子によって生成されたクエリの末尾には、その生成クエリに付加される SETTINGS 句を指定できます: FROM t |> LIMIT 1 SETTINGS max_threads = 1SELECT * FROM (SELECT * FROM t) LIMIT 1 SETTINGS max_threads = 1 と同じです。これは、サブクエリ、CREATE VIEWview テーブル関数など、クエリ設定を個別に処理しない場所でも機能します。チェーン途中の SETTINGS 句はそのステージに残り、そのステージは次の演算子のサブクエリになります。括弧で囲まれたオペランドを持つ集合演算の後では、末尾に SETTINGS を指定できません。サブクエリを使用する同等のクエリでも、その位置に SETTINGS 句を指定することはできません。
  • 最初のパイプ演算子より前のクエリにある SETTINGS 句はそのクエリに残り、そのクエリは生成されるラッパーのサブクエリになります。通常の設定は、サブクエリの解釈時にその設定が適用されるため、引き続き機能します。唯一の例外は、クエリアナライザを選択する設定の組である enable_analyzer とその別名 allow_experimental_analyzer です。これらはサブクエリ内で変更できないため、SELECT number FROM numbers(1) SETTINGS enable_analyzer = 0 |> LIMIT 1INCORRECT_QUERY をスローします。これは、同等の手書きの SELECT * FROM (SELECT number FROM numbers(1) SETTINGS enable_analyzer = 0) LIMIT 1 とまったく同じです。これら2つの設定は最後のパイプ演算子の後に記述するか、クエリの外部から渡してください。
  • パイプ演算子は、集合演算を含め、その前にあるクエリ全体に結び付きます: SELECT 1 UNION ALL SELECT 2 |> AGGREGATE count() では、集約は UNION ALL の結果に適用されます。パイプ演算子の後に UNION でクエリを続けるには、|> UNION 演算子または括弧を使用します。
  • パイプ演算子は、SELECT クエリが想定されるあらゆる場所で使用できます: サブクエリ、INSERT ... SELECT (INSERT INTO t FROM src |> ... 形式を含む) 、CREATE VIEWview テーブル関数などです。
  • カラム名をその場で変更する専用の演算子はありません。|> SELECT * EXCEPT (old_name), old_name AS new_name、または SET 演算子と DROP 演算子を使用してください。
最終更新日 2026年8月14日