0

我想使用preparedstatement 编写一个mysql 选择查询。但是最后一部分存在语法错误,即concat('%', itemName, '%')"; itemNametable 的一列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. 它将返回表中易于解析的字段列表。您可以使用正则表达式或简单的字符串操作方法自己实现“like”语句,例如startsWith("xyz")代替like 'xyz%'endsWith("xyz")代替like '%xyz'contains("xyz")代替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 回答