sql >> Database teknologi >  >> RDS >> Oracle

Hvordan returnerer man rækker baseret på databasebrugeren og tabellens indhold?

Baseret på dit tidligere spørgsmål og de oplysninger, du postede, er det sådan, jeg forstod spørgsmålet:hvis du gav select på hele bordet til enhver bruger, så er den i stand til at hente alle rækker fra den. Du er nødt til at begrænse værdierne yderligere.

En mulighed - som vi taler om funktionen - er at bruge case i where klausul.

Her er et eksempel.

Eksempeldata:

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.

Funktion:

  • det accepterer brugernavn som en parameter (husk på bogstaver! I mit eksempel er alt små bogstaver. I dit, bliver du måske nødt til at bruge upper funktion eller sådan noget)
  • case siger:if par_user er lig med sys , lad den hente alle rækker. Ellers skal du kun hente rækker, hvis navnekolonnes værdi er lig med par_user
  • returner resultatet

Så:

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.

Lad os prøve det:

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. Hvordan justerer man SET intervalstyle (ændr interval output) i PostgreSQL?

  2. Subtraktion mellem to sql-forespørgsler

  3. Deling af en Oracle-databaseforbindelse mellem samtidige Selleri-opgaver

  4. Hvordan man ikke bygger PostgreSQL 9.0-udvidelser på RPM-platforme