如何使用占位符“?”在喜欢运营商?

时间:2019-04-29 10:42:05

标签: java mysql

我正在使用MySQL作为后端的基于Java的桌面应用程序。在此应用程序中有一个名为“搜索”的部分,其中有四个字段-关键技能(文本字段),经验(组合框),城市(组合框)和通知期(组合框)。这四个字段的所有值都将在运行时提供。关键技能是用逗号分隔的值。我想要一个使用LIKE运算符的MySQL查询,借助它,我不必每次在“关键技能”文本字段中都提供逗号分隔的值。我只在运行时提供一个值,然后基于该值,查询将使用LIKE运算符获取结果。我的查询如下所示

我使用了占位符'?'由于我的查询是动态类型。可以在LIKE运算符中使用占位符,还是仅适用于静态类型查询?

String query = "SELECT F_Name, L_Name, Experience, Key_Skills, 
       FROM Candidate cd 
     JOIN Candidate2 cd2 ON(cd.Mobile = cd2.C_Mobile) 
      WHERE Key_Skills LIKE '%?%'"; 

当我执行上面的查询时,它产生一个错误说明-您的SQL语法有错误;检查与您的MySQL服务器版本服务器版本相对应的手册以获取正确的语法,以在第1行“ FROM候选cd联接Candidate2 cd2 ON(cd.Mobile = cd2.C_Mobile)WHERE Key_Skills”附近使用

3 个答案:

答案 0 :(得分:2)

您可以使用concat()

String query = 
  "SELECT F_Name, L_Name, Experience, Key_Skills " + 
  "FROM Candidate cd JOIN Candidate2 cd2 ON (cd.Mobile = cd2.C_Mobile) " + 
  "WHERE Key_Skills LIKE concat('%', ?, '%')";

通过传递参数'someskill'执行上述代码时,函数concat()将产生此字符串'%someskill%',列Key_Skills将与此串联的字符串进行比较

答案 1 :(得分:2)

使用concat,您可以以简单的方式构建like字符串来管理参数值

   String query = "SELECT F_Name, L_Name, Experience, Key_Skills
     FROM Candidate cd 
     JOIN Candidate2 cd2 ON(cd.Mobile = cd2.C_Mobile) 
     WHERE Key_Skills LIKE concat('%' , ?, '%')"; 

请注意,您在key_Skills中使用了错误的逗号,必须将其删除

请问您是否有歧义栏,所以我已使用完全合格的sintax更新了答案

  String query = "SELECT 
        cd.F_Name
      , cd.L_Name
      , cd.Experience
      , cd.Key_Skills
     FROM Candidate cd 
     INNER JOIN Candidate2 cd2 ON cd.Mobile = cd2.C_Mobile 
     WHERE cd.Key_Skills LIKE concat('%' , ?, '%')"; 

答案 2 :(得分:2)

您可以在Java代码中执行前缀和后缀,而不是在SQL中将它们串联起来。

WHERE Key_Skills LIKE ?"; 

甚至允许使用通配符:

keySkills = keySkills.replace('*', '%');
keySkills = keySkills.replace('?', '_');

preparedStatement.setString(1, "%" + keySkills + "%");

JDBC代码将?替换为已准备好的语句值,并强制 到所需的SQL字符串类型。 setString负责转义撇号和其他字符。