如何在JDBC中使用MySQL子查询?

6

示例查询:

SELECT country 
FROM data 
WHERE city LIKE 
(SELECT LEFT ('jakartada',7));

JDBC中的示例:

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT ('?',7)) ";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1,     city    );
ResultSet rs = ps.executeQuery();

为什么这个不能正常工作?
4个回答

3

准备语句中没有参数,但代码尝试设置一个参数。请尝试向语句添加参数。

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT (?,7)) ";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1,     city    );
ResultSet rs = ps.executeQuery();

或者尝试删除设置参数的语句:

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT ('jakartada',7)) ";
PreparedStatement ps = koneksi.prepareStatement(sql);
ResultSet rs = ps.executeQuery();

那么捕获SQLException异常? - hd1
@Kevin Bowersox:如何在语句中添加参数?你能给出一个带有该查询的示例吗? - reza
@hd1 它将被缓存为它的检查异常。我关心的是百分号符号“%”。 - Smit

1

我相信你正在把这件事情搞得比必要的还要复杂,同时你也错过了一些东西。你是想做这个吗?

 SELECT country FROM data WHERE city LIKE 'jakarta%'

那么,您是否正在寻找每行中城市名称以“雅加达”开头的国家列?如果是这样,请不要忘记添加“%”符号。如果您不包含“%”符号,那么……
 SELECT country FROM data WHERE city LIKE 'jakarta'

并且

 SELECT country FROM data WHERE city = 'jakarta'

这两个词的意思完全相同,使用LIKE运算符是没有意义的;您可以使用=运算符。

因此,我认为您想要的MySQL查询是

 SELECT country FROM data WHERE city LIKE CONCAT(LEFT('jakartada',7),'%')

添加百分号即可。在这种情况下,您不需要子查询。

正如您指出的那样,您需要的Java代码是:

 String sql = "SELECT country FROM data " . 
              "WHERE city LIKE CONCAT(LEFT(?,7),'%')";

 PreparedStatement ps = koneksi.prepareStatement(sql);
 ps.setString(1,     city    );
 ResultSet rs = ps.executeQuery();
 ... process the rs records ...
 rs.close();  /* please don't forget to close your result sets */

是的,你知道我的意思,但是你的Java代码没有正常工作。 - reza
我在我的程序中使用这个查询来预测输入时的错误,所以系统将通过取输入字符串右侧或左侧的几个字符来分割字符串,并根据数据库中的数据进行匹配。我已经尝试在MySQL中运行这个查询,结果良好,但是我尝试在Java中实现它却没有很好地工作。例如,如果我有一个输入为“jakartada”的错误输入,则系统将检查从字符串左右两侧获取一些字符以找到正确的数据“jakarta”。 - reza

1

0

在运行时设置值时,不要在您的预处理语句中使用引号...否则它将仅将其视为输入而非作为占位符位置...从您的问号中删除单引号...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接