2012-05-26 3 views
4

Этот SQL-запрос, кажется, ударяя ORA 00920.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

Что вы пытаетесь сделать здесь. Случай в группе ??? –

+0

Вы связываетесь с тем, чтобы ставить имя пользователя в реестр ex в одном групповом отдыхе, там имя пользователя? –

+0

@ejb_guy см. Здесь: http://stackoverflow.com/questions/10763043/sql-how-to-group-by-with-a-special-condition –

ответ

3

не имеют Oracle DB, чтобы играть, но я предполагаю, что это может быть потому, что вы выбираете 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; 
+0

Спасибо. Он по-прежнему дает мне ту же ошибку, pin-points to row/col где-то здесь «... + $») THEN ... » –

+0

Еще несколько мыслей. Я не уверен, поддерживает ли Oracle regexp '\ d'. Вместо этого вы можете использовать '[0-9]' или '[: digit:]'. Какую версию Oracle вы используете? Возможно ли, что он почему-то не распознает REGEXP_LIKE? Попробуйте что-то вроде 'select 1 from dual, где regexp_like ('123', '^ [0-9] $')' и посмотреть, получите ли вы ошибку ... – jswolf19

+0

Я использую 9i, я проверю вашу рекомендацию сейчас , –

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.

Это немного лучше not to use the mon format model в Oracle, поскольку это не обязательно, согласовано между языками. Вместо этого используйте mm.


Поскольку вы используете 9i, вы можете использовать перевод вместо этого. Заменить регулярных выражений с:

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

Это заменяет номера ничего, а затем проверяет, есть ли что-нибудь осталось ...

+0

спасибо, кажется, что я использую Oracle 9i, и он не полностью поддерживает regexp_like. –

+0

http://stackoverflow.com/questions/10763043/sql-how-to-group-by-with-a-special-condition у вас есть альтернатива этому, зная, что regexp_like не работает в 9i –

+0

@chin , Я обновил свой ответ. – Ben

Смежные вопросы