我创建了3个字段语言,国家,安装类型的表.当我写一个查询来打印每个字段中的最大出现值时,我遇到了一个奇怪的问题.任何人都可以说出原因.这是我的代码.
PreparedStatement ps1= null;
ps1 = conn.prepareStatement("desc Configuration");
ResultSet rs1=ps1.executeQuery();
while(rs1.next()) {
System.out.print(rs1.getString(1)+":");
PreparedStatement ps2= null;
ps2 = conn.prepareStatement("select ? from Configuration c1 "+
" group by language "+
" having count(*) >= all " +
" ( select count(*) from Configuration c2 "+
" group by language )");
ps2.setString(1,rs1.getString(1));
ResultSet rs2=ps2.executeQuery();
while(rs2.next())
System.out.print(rs2.getString(1));
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是语言:语言但是我期待的输出是 语言:英语就是这样.如果我替换'?',我会得到以后的输出 在准备声明中使用语言.但是如果我给出相同的语言?我得到了我为ps2.setString提供的东西.
为什么会这样呢?有解决方案吗
? 在预准备语句中,它不是文本替换的占位符,它是一个参数,因此它的值始终被解释为数据,而不是查询语法的任意部分.
因此,在这种情况下,正在执行的实际查询是等效的select 'language' from ....
如果您需要替换除数据之外的部分查询,则必须使用连接(谨防SQL注入!):
ps2 = conn.prepareStatement("select "
+ rs1.getString(1)
+ " from Configuration c1 group by language having count(*) >= all( select count(*)from Configuration c2 group by language )");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |