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 では OFFSET が SAMPLE に属する一方、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 ALL、WITH FILL、INTERPOLATE を含め、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 = 1はSELECT * FROM (SELECT * FROM t) LIMIT 1 SETTINGS max_threads = 1と同じです。これは、サブクエリ、CREATE VIEW、viewテーブル関数など、クエリ設定を個別に処理しない場所でも機能します。チェーン途中のSETTINGS句はそのステージに残り、そのステージは次の演算子のサブクエリになります。括弧で囲まれたオペランドを持つ集合演算の後では、末尾にSETTINGSを指定できません。サブクエリを使用する同等のクエリでも、その位置にSETTINGS句を指定することはできません。 - 最初のパイプ演算子より前のクエリにある
SETTINGS句はそのクエリに残り、そのクエリは生成されるラッパーのサブクエリになります。通常の設定は、サブクエリの解釈時にその設定が適用されるため、引き続き機能します。唯一の例外は、クエリアナライザを選択する設定の組であるenable_analyzerとその別名allow_experimental_analyzerです。これらはサブクエリ内で変更できないため、SELECT number FROM numbers(1) SETTINGS enable_analyzer = 0 |> LIMIT 1はINCORRECT_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 VIEW、viewテーブル関数などです。 - カラム名をその場で変更する専用の演算子はありません。
|> SELECT * EXCEPT (old_name), old_name AS new_name、またはSET演算子とDROP演算子を使用してください。