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

データベースユーザーとテーブルの内容に基づいて行を返す方法は?

    以前の質問と投稿した情報に基づいて、私が質問をどのように理解したかを次に示します。selectを許可した場合 テーブル全体で任意のユーザーに、すべてをフェッチできます それからの行。値をさらに制限する必要があります。

    関数について話しているように、1つのオプションはcaseを使用することです。 where 条項。

    これが例です。

    サンプルデータ:

    SQL> create table rating as
      2    select 1 id, 'sys' name, 4 score from dual union all
      3    select 3,    'leo'     , 3 from dual union all
      4    select 6,    'scott'   , 5 from dual union all
      5    select 7,    'hr'      , 2 from dual;
    
    Table created.
    

    機能:

    • パラメータとしてユーザー名を受け入れます(大文字と小文字を区別します。私の例では、すべて小文字です。あなたの場合、おそらくupperを使用する必要があります。 関数またはそのようなもの)
    • case 言う:par_userの場合 sysと同じです 、すべての行をフェッチします。それ以外の場合は、名前列の値がpar_userと等しい行のみをフェッチします。
    • 結果を返す

    だから:

    SQL> create or replace function f_rating (par_user in varchar2)
      2    return number
      3  is
      4    retval number;
      5  begin
      6    select avg(score)
      7      into retval
      8      from rating
      9      where name = case when par_user = 'sys' then name
     10                        else par_user
     11                   end;
     12    return retval;
     13  end;
     14  /
    
    Function created.
    

    試してみましょう:

    SQL> select f_rating('sys') rating_sys,
      2         f_rating('hr')  rating_hr
      3  from dual;
    
    RATING_SYS  RATING_HR
    ---------- ----------
           3,5          2
    
    SQL>
    


    1. filestatusごとに最後の行の総数を表示するにはどうすればよいですか?

    2. mysqlcreateトリガー構文エラー

    3. 日時変数の時間部分を設定する

    4. MySQLでSUM()が機能しない:DISTINCTを使用したSUM()