ORA-00920:无效的关系运算符

时间:2012-05-26 14:18:48

标签: sql oracle9i

此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;

2 个答案:

答案 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

这会将数字替换为任何内容,然后检查是否还有其他内容......