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: 无效的关系运算符的主要内容,如果未能解决你的问题,请参考以下文章
在Oracle Apex中显示按钮时,服务器端条件取决于页面项的值?