eval テーブル関数は、引数をクエリ文字列として評価し、その文字列を単一の SELECT クエリとして実行します。
このテーブル関数は実験的機能であり、デフォルトでは無効になっています。使用するには、allow_experimental_eval_table_function 設定を有効にします。
SET allow_experimental_eval_table_function = 1;これには、アナライザ (enable_analyzer。デフォルトで有効) が必要です。
構文
eval(expression)
eval(SELECT ...)引数
expression— クエリ文字列を返す定数式です。クエリパラメータとスカラーサブクエリを使用できます。SELECT ...— クエリ文字列を返すSELECTクエリです。この形式はスカラーサブクエリのシンタックスシュガーです。eval(SELECT ...)はeval((SELECT ...))と等価なため、このクエリは必ずちょうど1行1カラムを返す必要があります。
式の値は、次のいずれかの型である必要があります。
StringNullable(String)LowCardinality(String)LowCardinality(Nullable(String))
値が NULL の場合、eval は例外をスローします。
戻り値
生成された SELECT クエリの結果をテーブルとして返します。
出力スキーマは eval テーブル関数の解析時に決定されるため、外側のクエリから、生成されたクエリの実際のカラム名や型を参照できます。
例
定数式を評価する例:
SELECT * FROM eval('SEL' || 'ECT 1 AS x');結果:
┌─x─┐
│ 1 │
└───┘クエリパラメータを使用する:
SET param_q = 'SELECT 2 AS y';
SELECT * FROM eval({q:String});結果:
┌─y─┐
│ 2 │
└───┘クエリテキストを返す SELECT クエリを評価します:
SELECT * FROM eval(SELECT 'SELECT 3 AS z');結果:
┌─z─┐
│ 3 │
└───┘生成したスキーマを外側のクエリで使用します:
SELECT x + 1 FROM eval('SELECT 4 AS x');結果:
┌─plus(x, 1)─┐
│ 5 │
└────────────┘制約事項
evalはクエリ アナライザ (enable_analyzer = 1) でのみ動作します。- 生成されるクエリは、
INTO OUTFILEやFORMATなどの出力オプションを含まない、単一のSELECTクエリでなければなりません。evalで複数のステートメントは実行できません。 - 生成されるクエリは自己完結している必要があります。独立したスコープで解決されるため、外側のクエリの
WITH別名やカラムは参照できません。 - 生成されるクエリでは、
evalテーブル関数を再度使用することはできません。 evalは、remote('host', eval(...))のように、別のテーブル関数の引数として使用できません。生成されたクエリをリモートサーバーで実行するには、これをviewでラップします:remote('host', view(SELECT * FROM eval(...)))。- 引数はクエリの解析時に一度だけ評価され、行ごとやブロックごとに評価されるわけではありません。
- 外側のクエリログには
evalを含む元のクエリが記録されます。生成されたSELECTクエリは、別個のユーザークエリとしては記録されません。
viewテーブル関数allow_experimental_eval_table_function設定