为什么我的预准备语句不起作用,而DB2中的常规语句工作?

时间:2014-12-16 12:29:13

标签: sql db2 prepared-statement

当我尝试在PreparedStatement

中使用以下查询时,我有一种奇怪的行为

查询本身如下:

SELECT 
    CASE  
        WHEN TYPE LIKE '%Linux%' THEN 'Linux' 
        ELSE 'UNKNOWN'
    END AS OS, 
COUNT(*) AS TOTAL 

FROM COMPUTERS.OS 

GROUP BY 
    CASE   
        WHEN TYPE LIKE '%Linux%' THEN 'Linux'
        ELSE 'UNKNOWN' 
    END

效果很好。但是当我创建如下的查询时:

SELECT 
    CASE  
        WHEN TYPE LIKE ? THEN ?
        ELSE 'UNKNOWN'

    END AS OS, 
COUNT(*) AS TOTAL 

FROM COMPUTERS.OS 

GROUP BY 
    CASE   
        WHEN TYPE LIKE ? THEN ? 
        ELSE 'UNKNOWN'
    END

并相应地设置

String os = "Linux";
ps.setString(1, "%" +  os  + "%");
ps.setString(2, os);
ps.setString(3, "%" +  os  + "%");
ps.setString(4, os);

它不起作用并抛出以下错误:

  

SQLCODE = -119,SQLSTATE = 42803,SQLERRMC = TYPE   SELECT或HAVING子句中的列引用无效,因为   它不是分组列;或GROUP BY中的列引用   条款无效。

有人可以解释一下我的PreparedStatement有什么问题吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

这可能与参数以及DB2如何确定group by子句是否与select中的列相同。一个简单的解决方法是使用子查询:

SELECT OS, COUNT(*) AS TOTAL 
FROM (SELECT os.*,
             (CASE WHEN TYPE LIKE '%Linux%' THEN 'Linux' 
                   ELSE 'UNKNOWN'
              END) AS OS
      FROM COMPUTERS.OS os
     ) os
GROUP BY OS;

对于通配符版本,您只需将通配符放入一次,编译器就应该接受查询。