カテゴリ:

テーブル関数

TO_QUERY

SQL テキストと、パラメータ化されている場合に SQL テキストに渡されるオプションの引数セットに基づく結果セットを返します。この関数は、 SQL のテキストを FROM 句のサブクエリの定義としてコンパイルします。アプリケーションやストアドプロシージャを記述する際、この関数を呼び出して SQL ステートメントを構築することができます。

注釈

この関数は、 SQL インジェクションのような潜在的なセキュリティリスクを持つクエリステートメントにユーザー入力を含めることができます。外部ソースが関数への入力元である場合、それらが検証されていることを確認してください。詳細については、 SQL インジェクション をご参照ください。

こちらもご覧ください:

実行時に SQL を構築する

構文

TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] )
Copy

引数

必須

SQL => 'string'

サブクエリの文字列表現。

オプション

arg => 'value'

SQL string に渡された バインド変数

戻り値

指定された SQL テキストまたは NULL の実行によって生成された結果セットを返します。いずれかの引数が NULL の場合、関数はエラーを報告せずに NULL を返します。

使用上の注意

  • すべての引数は次のいずれかの値である必要があります。

  • 引数で渡された文字列を別のデータ型に変換する必要がある場合、 SQL string変換関数 を使って文字列を別のデータ型に変換することができます。

  • 結果セットを定義する列のセットは、コンパイルされた SQL ステートメントの SELECT リストから派生します。

  • この関数は、 SQL ステートメントの FROM 句でのみ有効です。

テーブルを作成してデータを挿入します。

CREATE OR REPLACE TABLE to_query_example (
  deptno NUMBER(2),
  dname  VARCHAR(14),
  loc    VARCHAR(13))
AS SELECT
  column1,
  column2,
  column3
FROM
  VALUES
    (10, 'ACCOUNTING', 'NEW YORK'),
    (20, 'RESEARCH',   'DALLAS'  ),
    (30, 'SALES',      'CHICAGO' ),
    (40, 'OPERATIONS', 'BOSTON'  );
Copy

例ではこのテーブルのデータを使用します。

SQL ステートメントでの TO_QUERY の使用

まず、テーブル名にセッション変数(SQL 変数)を設定します。

SET table_name = 'to_query_example';
Copy

例では、セッション変数と IDENTIFIER() を使用してテーブルを特定しています。

IDENTIFIER() を使用してデータベース・オブジェクトを特定することは、コードの再利用性を高め、 SQL インジェクション のリスクを防ぐことができるため、ベスト・プラクティスです。

次の例では、 TO_QUERY 関数を使用して、 to_query_example テーブルの全データを返しています。

SELECT * FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
Copy
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
|--------+------------+----------|
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

次の例では、 TO_QUERY 関数を使用して、 to_query_example テーブルの deptno 列のすべての値を返しています。

SELECT deptno FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
Copy
+--------+
| DEPTNO |
|--------|
|     10 |
|     20 |
|     30 |
|     40 |
+--------+

次の例では、 TO_QUERY 関数を使用して、 to_query_example テーブルの deptno10 が等しい行を返すように、 SQL ステートメントに引数を渡しています。

SELECT * FROM TABLE(
  TO_QUERY(
    'SELECT * FROM IDENTIFIER($table_name)
    WHERE deptno = TO_NUMBER(:dno)', dno => '10'
    )
  );
Copy
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
|--------+------------+----------|
|     10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+

次の例は前の例と同じですが、 TO_QUERY 関数に deptno 値を渡すためにセッション変数を使用しています。

SET dept = '10';

SELECT * FROM TABLE(
  TO_QUERY(
    'SELECT * FROM IDENTIFIER($table_name)
    WHERE deptno = TO_NUMBER(:dno)', dno => $dept
    )
  );
Copy
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
|--------+------------+----------|
|     10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+

次の例では、 TO_QUERY 関数を使用して、 to_query_example テーブルの deptno10 と等しい行、または dnameSALES と等しい行を返すように、 SQL ステートメントに2つの引数を渡しています。

SELECT * FROM TABLE(
  TO_QUERY(
    'SELECT * FROM IDENTIFIER($table_name)
    WHERE deptno = TO_NUMBER(:dno) OR dname = :dnm',
    dno => '10', dnm => 'SALES'
    )
  );
Copy
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
|--------+------------+----------|
|     10 | ACCOUNTING | NEW YORK |
|     30 | SALES      | CHICAGO  |
+--------+------------+----------+

ストアドプロシージャでの TO_QUERY の使用

以下の例では、ストアドプロシージャで TO_QUERY 関数を使用しています。

CREATE OR REPLACE PROCEDURE get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
  res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
  RETURN TABLE(res);
END;
Copy

注: SnowSQLClassic Consoleexecute_stream または execute_string メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。

CREATE OR REPLACE PROCEDURE get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
  res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
  RETURN TABLE(res);
END;
$$
;
Copy

ストアドプロシージャを呼び出します。

CALL get_num_results_tq('SELECT * FROM to_query_example');
Copy
+----------+
| COUNT(*) |
|----------|
|        4 |
+----------+
CALL get_num_results_tq('SELECT * FROM to_query_example WHERE deptno = 20');
Copy
+----------+
| COUNT(*) |
|----------|
|        1 |
+----------+

次の例では、バインド変数を使用してストアドプロシージャで TO_QUERY 関数を使用しています。

CREATE OR REPLACE PROCEDURE get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
  res RESULTSET DEFAULT (SELECT * FROM TABLE(
    TO_QUERY(
      'SELECT * FROM to_query_example
      WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
    )
  ));
BEGIN
  RETURN TABLE(res);
END;
Copy

注: SnowSQLClassic Consoleexecute_stream または execute_string メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。

CREATE OR REPLACE PROCEDURE get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
  res RESULTSET DEFAULT (SELECT * FROM TABLE(
    TO_QUERY(
      'SELECT * FROM to_query_example
      WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
    )
  ));
BEGIN
  RETURN TABLE(res);
END;
$$
;
Copy

ストアドプロシージャを呼び出します。

CALL get_results_tqbnd('40');
Copy
+--------+------------+--------+
| DEPTNO | DNAME      | LOC    |
|--------+------------+--------|
|     40 | OPERATIONS | BOSTON |
+--------+------------+--------+

セッション変数を使用してストアドプロシージャを呼び出します。

SET dept = '20';

CALL get_results_tqbnd($dept);
Copy
+--------+----------+--------+
| DEPTNO | DNAME    | LOC    |
|--------+----------+--------|
|     20 | RESEARCH | DALLAS |
+--------+----------+--------+