当我尝试在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怎么了吗?
谢谢。
发布于 2014-12-16 12:47:11
这可能与参数有关,以及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;对于通配符版本,您将只放通配符一次,编译器应该接受查询。
https://stackoverflow.com/questions/27504713
复制相似问题