sql >> データベース >  >> RDS >> Oracle

CASEステートメントのELSEでselectを使用すると、ORA-00937が得られます。単一グループのグループ関数ではありません。

    少し異なるアプローチを取りますが、機能しているように見えます。大文字と小文字を区別してカウントする代わりに、集計がnullであるかどうか(coalesceが一連の最初のnull以外の値を返す)、およびそれがメッセージの代わりになるかどうかを確認するだけです。これにより、必要とは思わない第2レベルのグループ化が回避されます。

    あまりにも悪いlistaggは、アグリゲート内の個別化もサポートしていません。インラインビューを回避できます。

    SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser), 
                    'There are no users connected') as userList
    FROM (select distinct osuser from v$session) A
    WHERE A.osuser!= 'SYSTEM' and A.osuser not like 'VMCONFTEST%'
    

    これには、caseステートメントが短絡しようとしている可能性のあるユーザーのリストを生成しようとするというオーバーヘッドがあります。ただし、V $ sessionにレコードがない場合は、選択をすばやく行う必要があります。

    正直なところ、なぜこれを行う必要があるのか​​わかりません。リスト内のnullは、通常、ユーザーがいないことを示す適切な応答です。 UIはnullを処理し、ユーザーがいないことを意味します。

    インラインビューにwhere句を追加すると、さらに高速になる可能性があります。

    SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser), 
                    'There are no users connected') as userList
    FROM (SELECT distinct osuser 
          FROM v$session
          WHERE A.osuser!= 'SYSTEM' 
            and A.osuser not like 'VMCONFTEST%') A
    


    1. OracleLISTAGG関数の使用方法

    2. MySQLとNeo4jを一緒に使用するのは良い考えですか?

    3. make_timestamptz()がPostgreSQLでどのように機能するか

    4. Djangoのmanage.pyを使用してCLIからデータベースをクリアする最も簡単な方法は何ですか?