メインコンテンツへスキップ

概要

条件式の結果をそのまま使用する

条件式の結果は常に 01、または NULL です。そのため、条件式の結果は次のようにそのまま使用できます。

条件式における NULL 値

条件式に NULL 値が含まれる場合、結果も NULL になります。
したがって、types が Nullable の場合は、クエリを慎重に組み立てる必要があります。 次の例では、multiIf に等価条件を追加していないために失敗することを示しています。

CASE ステートメント

ClickHouse の CASE 式は、SQL の CASE 演算子と同様の条件分岐ロジックを提供します。条件を評価し、最初に一致した条件に基づいて値を返します。 ClickHouse は 2 種類の CASE をサポートしています。
  1. CASE WHEN ... THEN ... ELSE ... END
    この形式では高い柔軟性があり、内部的には multiIf 関数を使って実装されています。各条件は個別に評価され、式には定数以外の値を含めることもできます。
  1. CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
    このより簡潔な形式は、定数値との一致に最適化されており、内部的には caseWithExpression() を使用します。
たとえば、次のように記述できます。
この形式では、返される式も定数である必要はありません。

注意点

ClickHouse は、CASE 式 (または multiIf などの内部的に等価な処理) の結果の型を、条件を評価する前に決定します。これは、返される式の型が異なる場合、たとえばタイムゾーンや数値型が異なる場合に重要です。
  • 結果の型は、すべての分岐の中で互換性のある最も大きい型に基づいて選択されます。
  • いったんこの型が選択されると、他のすべての分岐は暗黙的にその型にキャストされます。実行時にそのロジックが決して実行されない場合でも同様です。
  • DateTime64 のようにタイムゾーンが型シグネチャの一部である型では、これによって予期しない動作が生じることがあります。ほかの分岐で異なるタイムゾーンを指定していても、最初に見つかったタイムゾーンがすべての分岐に使用される場合があります。
たとえば、以下ではすべての行が、最初に一致した分岐のタイムゾーン、すなわち Asia/Kolkata のタイムスタンプを返します
ここで ClickHouse は、複数の DateTime64(3, <timezone>) 戻り値型を認識します。最初に見つかった DateTime64(3, 'Asia/Kolkata' を共通型として推論し、他の分岐を暗黙的にこの型にキャストします。 これは、意図したタイムゾーンのフォーマットを保持するために、文字列に変換することで対処できます:

clamp

導入バージョン: v24.5.0 値を指定された最小値と最大値の範囲内に制限します。 値が最小値未満の場合は最小値を返します。値が最大値を超える場合は最大値を返します。それ以外の場合は、値自体を返します。 すべての引数は比較可能な型である必要があります。結果の型は、すべての引数の中で最も広い互換型になります。 構文
引数
  • value — 制限する値。 - min — 下限値。 - max — 上限値。
戻り値 [min, max] の範囲に制限された値を返します。 基本的な使い方
Query
Response
値が最小値未満です
Query
Response
最大値を超えた値
Query
Response

greatest

導入バージョン: v1.1.0 引数の中で最も大きい値を返します。 NULL 引数は無視されます。
  • Array の場合、辞書順で最大の配列を返します。
  • DateTime 型の場合、結果の型は最大の型に昇格されます (例: DateTime32 と混在している場合は DateTime64) 。
NULL の動作を変更するには、設定 least_greatest_legacy_null_behavior を使用しますバージョン 24.12 では後方互換性のない変更が導入され、NULL 値は無視されるようになりました。以前は、引数のいずれかが NULL の場合に NULL を返していました。 従来の動作を維持するには、設定 least_greatest_legacy_null_behavior (デフォルト: false) を true に設定してください。
構文
引数
  • x1[, x2, ...] — 比較対象の 1 つまたは複数の値。すべての引数は比較可能な型である必要があります。Any
戻り値 引数の中で最も大きい値を返します。戻り値は、互換性のある最も広い型に昇格されます。Any 数値型
Query
Response
Array
Query
Response
DateTime型
Query
Response

if

導入バージョン: v1.1.0 条件分岐を行います。
  • 条件 cond が非ゼロの値として評価された場合、この関数は式 then の結果を返します。
  • cond が 0 または NULL として評価された場合は、式 else の結果が返されます。
設定 short_circuit_function_evaluation では、短絡評価を使用するかどうかを制御します。 有効な場合、式 thencond が true の行でのみ評価され、式 elsecond が false の行でのみ評価されます。 たとえば、短絡評価を使用すると、次のクエリを実行してもゼロ除算の例外はスローされません。
thenelse は同様の型である必要があります。 構文
引数
  • cond — 評価される条件。UInt8Nullable(UInt8)、または NULL
  • thencond が true の場合に返される式。 - elsecond が false または NULL の場合に返される式。
戻り値 条件 cond に応じて、then または else の式の結果を返します。 使用例
Query
Response

least

導入バージョン: v1.1.0 引数の中で最も小さい値を返します。 NULL の引数は無視されます。
  • 配列の場合、辞書順で最小の配列を返します。
  • DateTime型の場合、結果の型は最大の型に昇格されます (たとえば、DateTime32 と混在している場合は DateTime64) 。
NULL の動作を変更するには、設定 least_greatest_legacy_null_behavior を使用しますバージョン 24.12 では、NULL 値が無視されるようになる後方互換性のない変更が導入されました。以前は、引数のいずれかが NULL の場合、NULL を返していました。 以前の動作を維持するには、設定 least_greatest_legacy_null_behavior (デフォルト: false) を true に設定してください。
構文
引数
  • x1[, x2, ...] — 比較する単一の値または複数の値。すべての引数は、相互に比較可能な型である必要があります。Any
戻り値 引数の中で最も小さい値を返します。戻り値の型は、互換性のある最も大きい型に昇格されます。Any 数値型
Query
Response
Array
Query
Response
DateTime型
Query
Response

multiIf

導入バージョン: v1.1.0 クエリ内で CASE 演算子をより簡潔に記述できます。 各条件は順番に評価されます。最初に true (非ゼロかつ NULL ではない) となった条件に対応する分岐値を返します。 いずれの条件も true でない場合は、else の値を返します。 設定 short_circuit_function_evaluation は、 短絡評価を使用するかどうかを制御します。有効な場合、then_i 式は ((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i) が true になる行でのみ評価されます。 たとえば、短絡評価を使用すると、次のクエリを実行してもゼロ除算例外は発生しません。
すべての分岐式と else 式は、共通のスーパータイプである必要があります。条件が NULL の場合は false として扱われます。 構文
別名: caseWithoutExpression, caseWithoutExpr 引数
  • cond_Nthen_N を返すかどうかを制御する、N 番目に評価される条件。UInt8 または Nullable(UInt8) または NULL
  • then_Ncond_N が true の場合に返される関数の結果。 - else — どの条件も true でない場合の関数の結果。
戻り値 一致した cond_N に対応する then_N の結果を返し、どれにも一致しない場合は else の結果を返します。 使用例
Query
Response
最終更新日 2026年7月2日