像列名一样使用MySQL

时间:2013-03-21 19:57:39

标签: java mysql prepared-statement sql-like

我想使用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%'";

3 个答案:

答案 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