【问题标题】:Using MySQL like for Column name使用 MySQL like 作为列名
【发布时间】:2013-03-21 19:57:38
【问题描述】:

我想使用preparedstatement 编写一个mysql 选择查询。但是最后一部分有语法错误concat('%', itemName, '%')";itemName是表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%'";

【问题讨论】:

  • 这是用什么应用程序语言编写的?
  • 对不起。我无法提及。用 Java 编写

标签: java mysql prepared-statement sql-like


【解决方案1】:

字段名称不能使用占位符。查询必须是

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

占位符仅用于 VALUES。字段/表名、函数名或 SQL 中的任何“结构”词都是禁止使用的。

这是 mysql 准备语句的一般规则。这不是 java/php/c#/whatever 限制。

【讨论】:

  • @Marc B 你的意思是我不能对列名使用 Like 吗?如何在 mysql 查询中使用 like 与列名进行比较。如果我使用 where 它只给出完全匹配?
  • 您可以根据需要使用任意数量的列。您只是不能使用占位符来指定它们。
  • 找到了我的问题的答案。 String sql ="SELECT * FROM ItemMain WHERE ? = 'All' OR itemName like '%"+keyword+"%'";对象 [] 值 ={关键字};结果集 res = DBHandller.getData(sql, conn, values);我在这里交换了列名、关键字并更改了语法 '%"+keyword+"%'"; 现在它工作正常。thnx all.
【解决方案2】:

虽然@Marc B 是绝对正确的 (+1) 我想补充一点。我相信您有一项真正的任务需要这样的功能,所以我想向您推荐以下解决方案。

您可以如下动态创建查询。如果您使用的是普通 JDBC,您可以运行类似 desc YOUR_TABLE_NAME 的查询。它将返回表中易于解析的字段列表。您可以使用正则表达式或简单的字符串操作方法自己实现您的“like”语句,如startsWith("xyz") 而不是like 'xyz%'endsWith("xyz") 而不是like '%xyz'contains("xyz") 而不是like '%xyz%'。现在您可以通过添加满足您要求的字段来动态创建 SQL 语句。

【讨论】:

  • 感谢 @AlexR 的帮助。看来我必须在这种情况下使用正则表达式。
【解决方案3】:

找到了我的问题的答案。

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

我在这里交换了列名、关键字并更改了语法 '%"+keyword+"%'"; 现在它工作正常。谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2020-11-08
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多