0

準備済みステートメントを使用して mysql 選択クエリを作成したいと考えています。concat('%', itemName, '%')"; itemNameしかし、 table の列である最後の部分に構文エラーがありますItemMain。以下の3つのクエリをすでに試しました。

String sql ="SELECT * FROM ItemMain WHERE ? = 'All' OR ? like concat('%', itemName, '%')";
String sql ="SELECT * FROM ItemMain WHERE ? = 'All' OR ? like  '%'+itemName+'%'";
String sql ="SELECT * FROM ItemMain WHERE ? = 'All' OR ? like  '%itemName%'";
4

3 に答える 3

5

フィールド名にプレースホルダーを使用することはできません。クエリは

... WHERE somefield=? OR otherfield LIKE concat('%', ?, '%')

プレースホルダーはVALUES専用です。フィールド/テーブル名、関数名、または SQL の「構造」語は使用できません。

これは、mysql の準備済みステートメントの一般的なルールです。これは、java/php/c# などの制限ではありません。

于 2013-03-21T20:01:05.207 に答える
1

@Marc Bは絶対に正しいですが(+1)何か追加したいと思います。そのような機能を必要とする実際のタスクがあると思いますので、次の解決策を提案したいと思います。

次のようにクエリを動的に作成できます。プレーンな JDBC を使用している場合は、次のようにクエリを実行できますdesc YOUR_TABLE_NAME。テーブル内のフィールドの解析しやすいリストを返します。startsWith("xyz")の代わりにlike 'xyz%'endsWith("xyz")の代わりにlike '%xyz'、のcontains("xyz")代わりに、正規表現または単純な文字列操作メソッドを使用して、「like」ステートメントを自分で実装できますlike '%xyz%'。要件を満たすフィールドを追加することで、SQL ステートメントを動的に作成できるようになりました。

于 2013-03-21T20:08:16.183 に答える
0

私の問題に対する答えを見つけました。

 String sql ="SELECT * FROM ItemMain WHERE ? = 'All' OR itemName like '%"+keyword+"%'";
        Object []values ={keyword};
        ResultSet res = DBHandller.getData(sql, conn, values);

列名、キーワードを交換し、ここで構文を変更しました '%"+keyword+"%'"; 今では正常に動作します.thnx al

于 2013-03-22T06:45:19.627 に答える