0

次のクエリがあるとします。

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND UNIX_TIMESTAMP(Logins.FechaLogin) >= UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(Logins.FechaLogin) <= UNIX_TIMESTAMP(?)

そして、私は次のようなものが欲しい:

Date = UNIX_TIMESTAMP(Logins.FechaLogin);

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND Date >= UNIX_TIMESTAMP(?) AND Date <= UNIX_TIMESTAMP(?)

stmt.setInt(1, EmployeeId);
stmt.setString(2, Date1);
stmt.setString(3, Date2);

すべて準備済みステートメント (JDBC prepareStatement()) に入れます。クエリへの冗長性を避けるために、このようなことを行う方法はありますか? それともこれは役に立たないものですか?ちなみに、私が正しければ、各 SELECT 反復で UNIX_TIMESTAMP 関数を渡す必要があると思います。

ありがとう!

4

1 に答える 1

1

簡単に言えばいいえです。列参照の代わりに、または列参照を含む式の代わりに MySQL 変数を参照することはできません。準備済みステートメントでは、変数を値に「バインド」することしかできません。テーブル名または列名を「バインド」することはできません。

(この制限は、SQL ステートメントの処理方法に関係しています。SQL ステートメントが「準備」されると、オプティマイザーは、参照されているすべてのテーブルと列を認識する必要があります。参照が有効であることを確認する必要があります。ユーザーが参照されるオブジェクトに対する権限を持っていること、列のデータ型を検索すること、適切なインデックスを確認することなどを行う必要があります.問題は、列名が欠落している場合、それができないことです.これは、なぜあなたがそうしないのかを説明しています.あなたがやりたいことをする方法の例を見つけることはできません.)

明らかに、Java 変数と文字列操作を使用して、MySQL に渡される SQL テキストを含む文字列を生成できます。ただし、MySQL に渡される最終的な文字列にはプレースホルダーを含めることができますが、それらは値のプレースホルダーにしかできません。

それはあなたの質問に答えるはずです。


UNIX_TIMESTAMP 関数の使用 (それが必要か望ましいか)、関数でラップされた列参照を持つ述語のパフォーマンスへの影響などに関して、他にもいくつかのメモがあります。しかし、それらはあなたが求めていた質問に実際には答えません。 .

于 2013-07-08T20:23:42.167 に答える