我想使用preparedstatement编写一个mysql select查询。但最后一部分concat('%', itemName, '%')";
itemName
的theres语法错误是表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%'";
答案 0 :(得分:5)
您不能将占位符用于字段名称。查询必须是
... WHERE somefield=? OR otherfield LIKE concat('%', ?, '%')
占位符仅适用于 VALUES 。字段/表名,函数名或SQL中的任何“结构”字都是不受限制的。
这是mysql准备语句的一般规则。它不是java / php / c#/无论什么限制。
答案 1 :(得分:1)
虽然@Marc B绝对正确(+1)我想补充一些东西。我相信你有一个真正的任务,你需要这样的功能,所以我想建议你以下的解决方案。
您可以动态创建查询,如下所示。如果您使用的是普通JDBC,则可以运行desc YOUR_TABLE_NAME
之类的查询。它将返回表格中易于解析的字段列表。您可以使用正则表达式或简单的字符串操作方法自己实现“喜欢”语句,而不是startsWith("xyz")
,like 'xyz%'
而不是endsWith("xyz")
和like '%xyz'
而不是contains("xyz")
。现在,您可以通过添加符合要求的字段来动态创建SQL语句。
答案 2 :(得分: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