首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我准备好的语句不能工作,而常规语句在DB2中工作呢?

问为什么我准备好的语句不能工作,而常规语句在DB2中工作呢?
EN

Stack Overflow用户
提问于 2014-12-16 12:29:13
回答 1查看 139关注 0票数 0

当我尝试在PreparedStatement中使用下面的查询时,我有一种奇怪的行为

查询本身如下:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

并相应地设置

代码语言:javascript
复制
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怎么了吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-16 12:47:11

这可能与参数有关,以及DB2如何确定group by子句是否与select中的列相同。简单的工作是使用子查询:

代码语言:javascript
复制
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;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27504713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档