4

この 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;
4

2 に答える 2

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;
于 2012-05-26T14:25:51.923 に答える
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')

この2番目のクエリは、あなたが望むものに似ていると思います. 実際のユーザー名を返しますが、数字だけのすべてのユーザー名をグループ化します。代わりに表示したい場合は、ケースによって返されたユーザー名の列を置き換えるだけですGRP_OTHERS

必ずしも言語間で一貫性があるとは限らないため、Oracle でフォーマット モデルを使用しないmon方が少し良いです。mm代わりに使用してください。


9i を使用しているため、代わりに翻訳を使用できます。正規表現を次のように置き換えます。

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

これは数字を何も置き換えず、何か残っているかどうかを確認します...

于 2012-05-26T15:01:39.037 に答える