動的パラメータを使用すると、データベースの PrepareStatement と同様に、? プレースホルダーで SQL クエリをパラメーター化できます。エンジンは、クエリ時に各プレースホルダーを対応する値に置き換えます。
主な利点はキャッシュ効率です。同じ SQL テンプレートから構築されたクエリは、渡されるパラメーター値に関係なくキャッシュヒット率を向上させます。これにより、異なる入力での繰り返し検索が、毎回完全なクエリ評価をトリガーする代わりに、キャッシュにヒットするようになります。
注:動的パラメータは値のみを置き換えることができます。キーワードやフィールド名を置き換えることはできません。
仕組み
SQL ステートメント内のすべての ? プレースホルダーは位置指定です。dynamic_params を使用して、ネストされた配列として値を渡します:
dynamic_params:[[value1, value2, ...]]内部配列は、左から右の順で ? プレースホルダーにマップされます。? は型情報を持たないため、CAST(? AS <type>) を使用して明示的に型を指定します。
例
基本的な型キャストと文字列マッチング
SELECT i1, cast(? as bigint) FROM t1 WHERE (i2 > 5 AND d3 < 10.1) OR s5 = ?dynamic_params:[[10, "str5"]]最初の ? は 10 (BIGINT にキャスト) を受け取り、2番目の ? は "str5" (文字列) を受け取ります。
地理空間検索と全文検索
SELECT
price,
title,
compute(
longitude,
latitude,
city_id,
CAST(? AS double),
CAST(? AS double),
CAST(1 AS bigint)
) AS distance
FROM
store,
unnest(store.sub_table)
WHERE
MATCHINDEX('shop', ?)
AND QUERY(name, ?)dynamic_params:[[119.98844256998,
36.776817017143,
"excellect",
"fruit OR watermelon"]]4つの ? プレースホルダーは、経度 (DOUBLE)、緯度 (DOUBLE)、MATCHINDEX の検索語、QUERY 式の順で値を受け取ります。CAST(1 AS bigint) はプレースホルダーではなくリテラルであり、dynamic_params には含まれません。
制限事項
?プレースホルダーは、SQL のキーワードやフィールド名ではなく、値のみを置き換えることができます。各
?は位置によってマッチングされます。