2012-05-26 2 views
4

이 SQL 쿼리 내가 함께 플레이 할 수있는 오라클 DB가없는 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

사용자 이름 회의록을 하나의 그룹에두고 사용자 이름에 쉼표를 붙이시겠습니까? –

+0

@ejb_guy 여기를 참조하십시오. http://stackoverflow.com/questions/10763043/sql-how-to-group-by-with-a-special-condition –

답변

3

을 치는 것 같다,하지만 난 당신이 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

감사합니다. 여전히 나에게 같은 오류가 발생합니다. 여기에 행/열 어딘가에 "~ + $ ') 핀 포인트 ..." –

+0

몇 가지 더 생각해보십시오. Oracle regexp가'\ d'를 지원하는지 잘 모르겠습니다. '[0-9]'또는'[: digit :]'를 대신 사용하는 것이 좋습니다. 어떤 오라클 버전을 사용하고 있습니까? 그것은 어떤 이유에서'REGEXP_LIKE'를 인식하지 못할 수 있습니까? '이중 선택에서 1을 선택하십시오. regexp_like ('123 ','^ [0-9] $ ')'와 같은 오류를 보시고 ... – jswolf19

+0

9i를 사용하고 있습니다. . –

1

나는 확실히 당신이 게시하는지 신뢰하지 않는 ...

조회에 ORA-00979: Not a GROUP BY expression가 발생한다. 이는 분석 함수에 포함되지 않은 열, 즉 usernamegroup 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). 대신 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

관련 문제