此SQL查询似乎正在触及ORA 00920。
select username, count(*)
from host
where created_dt
between to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss')
and to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
GROUP BY CASE
WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
ELSE username
END;
答案 0 :(得分:3)
我没有可以使用的Oracle数据库,但我想这可能是因为您选择username
但不按此分组。您应该能够通过使用子查询来解决这个问题:
select username, count(*)
from (select CASE
WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
ELSE username
END as username
from host
where created_dt
between to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss')
and to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
)
GROUP BY username;
答案 1 :(得分:1)
我不太相信你发布的内容......
您的查询应该抛出ORA-00979: Not a GROUP BY expression
。这是因为未包含在分析函数中的列,即username
未反映在group by
中。
ORA-00920意味着您缺少以下某项内容:=, <>, not in, in, !=, is not null, is null, not like, like
等。您确定发布了正确的查询吗?
在11.2中,创建一个近似于你的表的东西,如下所示:
create table host
( username varchar2(100)
, created_dt date );
insert into host
select level, sysdate - level
from dual
connect by level <= 10
;
insert into host
select chr(ascii(level) + 32), sysdate - level
from dual
connect by level <= 10
;
commit ;
然后在ORA-00979中运行查询结果。将此更改为以下工作没问题。:
select case when regexp_like(username, '^\d+$') then 'GRP_OTHERS'
else username end as username
, count(*)
from host
where created_dt between
to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss') and
to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
group by case when regexp_like(username, '^\d+$') then 'GRP_OTHERS'
else username end
;
这可以替代地重写为:
select distinct username
, count(*) over ( partition by case when regexp_like(username, '^\d+$')
then 'GRP_OTHERS'
else username end )
from host
where created_dt between
to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss') and
to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
我认为第二个查询更像是你想要的。它返回实际的用户名,但将所有只是数字的组合在一起。如果您想改为GRP_OTHERS
,请更换案例返回的用户名列。
Oracle中的not to use the mon
format model略胜一筹,因为它不一定是跨语言的。请改用mm
。
当您使用9i时,您可以使用翻译。用以下内容替换正则表达式:
trim(translate(username,'0123456789',' ')) is null
这会将数字替换为任何内容,然后检查是否还有其他内容......