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

Posted

技术标签:

【中文标题】ORA-00920: 无效的关系运算符【英文标题】:ORA-00920: invalid relational operator 【发布时间】:2012-05-26 14:18:47 【问题描述】:

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

【问题讨论】:

你想在这里做什么。分组按??? 您是否要将用户名会议 reg ex 放在一个组中的用户名上? @ejb_guy 请看这里:***.com/questions/10763043/… 您的 created_dt 是日期时间类型? 基本上,它会尝试检查用户名是否为数字,例如34535,将其覆盖为 GRP_OTHERS 并将此计数添加到 GRP_OTHERS。 【参考方案1】:

我没有可使用的 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;

【讨论】:

谢谢。它仍然给我同样的错误,将行/列指向此处的某处“... +$') THEN ...” 那么,还有一些想法。我不确定 Oracle 正则表达式是否支持 \d。您可能想改用[0-9][:digit:]。您使用的是什么版本的 Oracle?是否有可能由于某种原因无法识别REGEXP_LIKE?试试select 1 from dual where regexp_like('123', '^[0-9]$') 之类的方法,看看是否有错误... 我正在使用 9i,我现在会检查您的推荐。 啊,看来REGEXP_LIKE 是在10G 中引入的...This 可能会帮助您...或者您可以做一些googling 以找到其他解决方法^_^ 谢谢。我接受这个作为答案,没想到这是由于 9i。【参考方案2】:

我不太相信你发布的内容...

您的查询应该抛出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 时,您可以使用 translate。将正则表达式替换为:

trim(translate(username,'0123456789',' ')) is null

这会将数字替换为空,然后检查是否还有任何剩余...

【讨论】:

谢谢,我好像用的是Oracle 9i,不完全支持regexp_like。 ***.com/questions/10763043/… 知道 regexp_like 在 9i 中不起作用,您有其他选择吗

以上是关于ORA-00920: 无效的关系运算符的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis报无效的关系运算符异常

Oracle SQL where 子句中的函数

在Oracle Apex中显示按钮时,服务器端条件取决于页面项的值?

为啥查询显示“无效的关系运算符”

Oracle - 当我使用 EXISTS 时,关系运算符无效

javascript运算符——关系运算符