语法错误当列名称包含下划线
我可以编译,但不能执行下面的错误代码 (使用的是Postgres):语法错误当列名称包含下划线
Fatal database error
ERROR: syntax error at or near "as"
Position: 13
import java.sql.*;
public class JDBCExample
{
private static final String JDBC_DRIVER = "org.postgresql.Driver";
private static final String URL = "jdbc:postgresql://hostname/database";
private static final String USERNAME = "username";
private static final String PASSWORD = "password";
public static void main(String[] args) throws Exception
{
Connection dbConn = null;
Statement query = null;
ResultSet results = null;
Class.forName(JDBC_DRIVER);
try
{
dbConn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
catch (SQLException e)
{
System.out.println("Unable to connect to database\n"+e.getMessage());
System.exit(1);
}
try
{
query = dbConn.createStatement();
results = query.executeQuery("select 20_5 as name from flowshop_optimums");
while (results.next())
{
System.out.println(results.getString("name"));
}
dbConn.close();
}
catch (SQLException e)
{
System.out.println("Fatal database error\n"+e.getMessage());
try
{
dbConn.close();
}
catch (SQLException x) {}
System.exit(1);
}
} // main
} // Example
这不是下划线,这是列名以数字开头的事实。你需要逃避这一点。
对于MySQL,使用反引号。
select `20_5` as name from flowshop_optimums
对于SQL Server,请使用方括号。
select [20_5] as name from flowshop_optimums
对于PostgreSQL,使用双引号。
select "20_5" as name from flowshop_optimums
试试这个:results = query.executeQuery(“select'20_5'as name from flowshop_optimums”);
我试过这个,但它没有选择命名列,而是输出20_5几次。 – 2011-06-08 14:05:04
20_5是你选择的。如果您希望列的名称为20_5,则需要“从flowshop_optimums中选择”某个值为20_5“。 – 2011-06-08 15:01:58
我的意思是这个专栏的名字是20_5。我想从中选择数值。 – 2011-06-08 15:03:50
您需要用反引号或括号括起20_5,这取决于您是否分别使用MySQL或SQLServer。
results = query.executeQuery("select \"20_5\" as name from flowshop_optimums");
,但你应该真的改变该列名。
对于反引号,我得到:致命数据库错误错误:语法错误处于或接近“'”位置:13.括号也是如此。 – 2011-06-08 14:18:55
@ Oleksandr:你使用的是什么RDBMS? – 2011-06-08 14:20:01
使用PostgreSQL。 – 2011-06-08 14:20:28