2017-04-06 77 views
0

我正试图使用​​一个实用程序,我可以在表的每列中获得最大数据长度。在Select子句中动态列上具有聚合函数的JDBC PreparedStatement

  1. 我有列表列中的列表。
  2. 我检查每个列表。
  3. 执行以下准备好的语句。

    String sql = "select max(datalength(?)) from Positions"; 
    
    for(Iterate over list of column names) 
    { 
        preparedStatement.setString(1, StringUtils.trim(columnName)); 
        ResultSet rs = preparedStatement.executeQuery(); 
        if (rs.next()) { 
         int length1 = rs.getInt(1); 
         //print column name and max data length 
        } 
        } 
    

似乎准备语句max函数取动态列不工作。它给出了不正确的值。

可以在select子句中使用动态列准备语句工作。

+0

否,占位符不能用于动态替换列名(或表名)。 – Berger

回答

0

使用准备好的语句,你可以做到这一点。我相信如果要求如此,那么DB设计中可能会有一个问题。

如果仍想继续你的方法,你可以用自己喜欢创建SQL字符串:

String sql = "select max(datalength("+ columnName +")) from Positions" 

或者: 你可以用`字符串#.replace()。

但它不好办法&可能会发生SQL注入。

+0

谢谢..这是我的第二个替代解决方案。我完全按照你的建议。我也想知道Prepared语句在select子句中是否永远不能与动态参数一起使用?为什么它不支持? – Suvasis

0

尝试以下..

Select max(length(<column_name>)) as max_length 

From <Table_name>; 
+2

尽管这段代码片段是受欢迎的,并且可能会提供一些帮助,但如果它包含* how *和* why *的解释](// meta.stackexchange.com/q/114762)问题。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –

相关问题