语法错误当列名称包含下划线

问题描述:

我可以编译,但不能执行下面的错误代码 (使用的是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 
+0

对于反引号,我得到:致命数据库错误错误:语法错误处于或接近“'”位置:13.括号也是如此。 – 2011-06-08 14:18:55

+0

@ Oleksandr:你使用的是什么RDBMS? – 2011-06-08 14:20:01

+0

使用PostgreSQL。 – 2011-06-08 14:20:28

试试这个:results = query.executeQuery(“select'20_5'as name from flowshop_optimums”);

+0

我试过这个,但它没有选择命名列,而是输出20_5几次。 – 2011-06-08 14:05:04

+0

20_5是你选择的。如果您希望列的名称为20_5,则需要“从flowshop_optimums中选择”某个值为20_5“。 – 2011-06-08 15:01:58

+0

我的意思是这个专栏的名字是20_5。我想从中选择数值。 – 2011-06-08 15:03:50

您需要用反引号或括号括起20_5,这取决于您是否分别使用MySQL或SQLServer。

results = query.executeQuery("select \"20_5\" as name from flowshop_optimums"); 

,但你应该真的改变该列名。