当我尝试在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有什么问题吗?
谢谢。
答案 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;
对于通配符版本,您只需将通配符放入一次,编译器就应该接受查询。