CATEGORII DOCUMENTE |
Pe langa functiile care controleaza modul de formatare sau conversie al datelor, Oracle ofera cateva functii de uz general, care specifica modul in care sunt tratate valorile NULL
NVL(val1,val2) - functia returneaza valoarea val1, daca aceasta este nenula, iar daca val1 este NULL atunci va returna valoarea val2. Functia NVL poate lucra cu date de tip caracter, numeric sau data calendaristica, insa este obligatoriu ca cele doua valori sa aiba acelasi tip.
select first_name, commission_pct, NVL(commission_pct,0.8)
from employees
where employee_id between 140 and 150
rezultatul returnat de aceasta comanda este cel din figura II.2.14.
FIRST_NAME |
COMMISSION_PCT |
NVL(COMMISSION_PCT,0.8) |
Trenna | ||
Curtis | ||
Randall | ||
Peter | ||
Eleni |
Figura II.2.14. Functia NVL
NVL2(val1,val2,val3) - daca valoarea val1 nu este nula atunci functia va returna valoarea val2, iar daca val1 are valoarea NULL atunci functia va returna valoarea val3 (vezi figura II.2.15.).
select first_name, commission_pct,
NVL2(commission_pct,'ARE','NU ARE')
from employees where employee_id between 140 and 150
FIRST_NAME |
COMMISSION_PCT |
NVL2(COMMISSION_PCT,'ARE','NUARE') |
Trenna |
NU ARE |
|
Curtis |
NU ARE |
|
Randall |
NU ARE |
|
Peter |
NU ARE |
|
Eleni |
ARE |
Figura II.2.15 Functia NVL2
NULLIF(expr1,expr2) - daca cele doua expresii sunt egale, functia returneaza NULL. Daca valorile celor doua expresii sunt diferite atunci functia va returna valoarea primei expresii (vezi figura II.2.16.).
select employee_id, first_name, last_name,
NULLIF(length(first_name),length(last_name))
from employees where employee_id between 103 and 142
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
NULLIF(LENGTH(FIRST_NAME),LENGTH(LAST_NAME)) |
Alexander |
Hunold | ||
Bruce |
Ernst | ||
Diana |
Lorentz | ||
Kevin |
Mourgos | ||
Trenna |
Rajs | ||
Curtis |
Davies | ||
Figura II.2.16 Functia NULLIF
COALESCE(expr1, expr2, , exprn) - functia returneaza valoarea primei expresii nenule (vezi figura II.2.17).
select coalesce(null, null, '33', 'test') from dual
COALESCE(NULL,NULL,'33','TEST') |
Figura II.2.17 Functia COALESCE
Oracle SQL ofera posibilitatea de a construi expresii alternative asemanatoare structurilor IF-THEN-ELSE prezente in alte limbaje.
DECODE(expresie, val11, val12, val21, val22, , valn1, valn2, val) aceasta compara valoarea expresiei cu valorile val11 val21 valn1. Daca valoarea expresiei este egala cu valoarea vali1, atunci functia va returna valoarea vali2. Daca functia nu este egala cu nici una din valorile vali1, atunci functia va returna valoarea val
select DECODE('Maria' ,'Dana', 'Ea este Ana' ,
'Maria','Ea este Maria' ,
'Nu e nici Ana nici Maria')
from dual
aceasta comanda va afisa mesajul Ea este Maria insa urmatoarea comanda va afisa Nu e nici Ana nici Maria
select DECODE('Valeria' ,'Dana', 'Ea este Ana' ,
'Maria','Ea este Maria' ,
'Nu e nici Ana nici Maria')
from dual
In locul functiei DECODE se poate folosi expresia conditionala CASE. Functia CASE utilizeaza cuvintele cheia when then else, si end pentru a indica ramura selectata. In general orice apel al functiei DECODE poate fi transcris folosind functia CASE. Chiar daca o expresie folosind CASE este mai lunga decat expresia echivalenta care foloseste functia DECODE, varianta cu CASE este mult mai usor de citit si greselile sunt depistate mai usor. In plus varianta CASE este compatibila ANSI-SQL
Cele doua comenzi de mai sus por fi transcrise cu ajutorul functiei CASE astfel
select CASE 'Maria'
WHEN 'Dana' THEN 'Ea este Ana'
WHEN 'Maria' THEN 'Ea este Maria'
ELSE 'Nu e nici Ana nici Maria'
END
from dual
select CASE 'Valeria'
WHEN 'Dana' THEN 'Ea este Ana'
WHEN 'Maria' THEN 'Ea este Maria'
ELSE 'Nu e nici Ana nici Maria'
from dual
3.Interogari multiple
In capitolele anterioare am aflat cum putem afisa informatii din baza de date, insa la fiecare rulare a unei comenzi SELECT am afisat date dintr-o singura tabela.
Unul dintre rezultatele procesului de normalizare este acela ca datele sunt memorate, de cele mai multe ori, in tabele diferite. De aceea, la afisarea diferitelor rapoarte va trebui sa puteti prelua date din mai multe tabele printr-o singura comanda SQL.
Din fericire SQL ofera facilitati pentru combinarea datelor din mai multe tabele si afisarea lor intr-un singur raport. O astfel de operatie se numeste join, sau interogare multipla.
Pe parcursul acestui capitol vom folosi ca exemple tabela Persoane a carei cheie primara este atributul IdPersoana tabela Firme a carei cheie primara este atributul IdFirm, si tabela Joburi cu cheia primara IdJob. Presupunem ca aceste tabele contin urmatoarele inregistrari:
Tabelul II.3.1. Tabela Persoane
IDPERSOANA |
NUME |
PRENUME |
LOCALITATE |
IDFIRM |
IDJOB |
Ionescu |
Gheorghe |
Brasov | |||
Vasilescu |
Vasile |
Cluj-Napoca | |||
Popescu |
Ioan |
Bucuresti | |||
Georgescu |
Maria |
Iasi | |||
Marinescu |
Angela |
Sibiu | |||
Antonescu |
Elena |
Sibiu | |||
Bischin |
Paraschin |
Brasov | |||
Olaru |
Angela |
Ploiesti |
Tabelul II.3.2. Tabela Firme
|
Tabelul II.3.3. Tabela Joburi
|
In Oracle exista doua moduri diferite de a scrie joinurile:
Prima metoda foloseste sintaxa specifica Oracle. In acest caz conditiile de join sunt incluse in clauza WHERE. Aceasta metoda este mai usor de inteles, insa are dezavantajul ca in aceeasi clauza WHERE se includ atat conditiile de filtrare a inregistrarilor afisate cat si conditiile de join.
A doua varianta foloseste sintaxa ANSI/ISO, care este putin mai greoaie, insa comenzile scrise folosind aceasta sintaxa sunt portabile si in alte SGBD-uri care folosesc limbajul SQL.
Indiferent de sintaxa folosita exista mai multe moduri de legare a tabelelor si anume:
Produsul cartezian - leaga fiecare inregistrare dintr-o tabela cu toate inregistrarile din cealalta tabela.
Equijoin - sunt legate doua tabele cu ajutorul unei conditii de egalitate
NonEquijoin in acest caz conditia de join foloseste alt operator decat operatorul de egalitatea
SelfJoin - este legata o tabela cu ea insasi, e folosita de obicei in conjunctie cu relatiile recursive.
OuterJoin - sunt o extensie a equijoinului, cand pentru unele inregistrari dintr-o tabela nu exista corespondent in cealalta tabela, si dorim ca aceste inregistrari fara corespondent sa fie totusi afisate.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1444
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved