Oracle Ders 25 – Single Row Functions – 05

Merhaba Arkadaslar,
Bu yazimda Single Row Function konusuna devam edecegim ve Oracle 11 G de bulunan fonksiyonlarin bir kismini daha gorecegiz ve bu yazim ile Single Row Function konusunu bitirecegim insallah 🙂
Bu yazimda anlatacagim Oracle fonksiyonlari ;

  • NVL
  • NVL2
  • NULLIF
  • TO_CHAR
  • DECODE
  • CASE
  • SOUNDEX
  • TO_NUMBER

NOT: Bu fonksiyonlari anlatirken ilk Single Row dersinde duzenledigimiz tablolari ve verileri kullanacagiz.

NVL
Oracle da bir degerin , NULL degerle isleme girmesi sonucu NULL dur. Bu durumdan kacinmak icin Oracle bize NVL fonksiyonunu sunar. NVL fonksiyonu ile , NULL degerleri isleme sokarken, bosluk veya 0 olarak degerlendirilmesini saglayabiliriz.

select title, discount, retail,retail-discount "Sales Price" from books;

oracle ders 25 01

Select sorgusu gelen verileri ve kolonlari inceledigimizde , bol miktarda NULL deger oldugunu gorebiliriz. Ornegin 30.95 fiyatindaki (retail) kitapta discount(indirim) degeri NULL dir. Sales Price (Satis Fiyati) retail-discount olarak hesaplanmaktadir, fakat sonuc NULL olmaktadir. Biraz once de belirttigim gibi Oracle da NULL bir degerle islemin sonucu da NULL dir. Simdi NVL fonksiyonuna neden ihtiyac duydugumuzu daha iyi anlamis olduk.

Simdi bu sorunumuzu NVL fonksiyonu ile cozelim. discount alani , null degerler icermektedir. NVL(discount,0) kullanim sekliyle, Oracle’a sunu belirtiyoruz ; eger discount alani NULL ise bu degeri 0 olarak degerlendir ve ona gore islemi yap.

select title, discount, retail,retail-NVL(discount,0) "Sales Price" from books;

oracle ders 25 02

Gordugunuz gibi Sales Price (Satis Fiyati)  bu sefer dogru sekilde geldi.
NVL fonksiyonunu numerik degerler icin kullanabildigimiz gibi , Date alanlar icin de kullanabiliriz.

NVL2
NVL2 fonksiyonu, NVL fonksiyonunu bir cesididir. Bu fonksiyonun genel formu su sekildedir; NVL2(x,y,z) eger x degeri NULL degilse degeri y yap eger NULL ise z yap. Yani NVL fonksiyonunda NULL ise 0 yap demistik , burada NULL degilse kosulunu da ekliyoruz.

select title, discount, retail,retail-NVL2(discount,2,0) "Sales Price" from books;

Bu sorgumuzda NVL2(discount,2,0) seklinde kullanim ile, eger discount alani NULL ise 0 NULL degilse 2 olarak isleme koyacaktir.

NULLIF
NULLIF fonksiyonu arguman olarak aldigi 2 degeri karsilastirir, eger bu degerler birbirine esitse NULL sonucunu dondururur, eger esit degilse ilk degeri dondurur.
NULLIF(a,b)

select NULLIF(10,10) from dual; //null
select NULLIF(10,5) from dual;  //10
select NULLIF(5,10) from dual;  //5
select NULLIF('JAVA','JAVA') from dual;  //null
select NULLIF('JAVA','C#') from dual;    //JAVA

TO_CHAR
Oracle ‘da TO_CHAR fonksiyonu tarihleri ve numerik degerleri formatli bir string degere donusturmek icin kullanilir. Daha once bahsettigim TO_DATE fonksiyonunun tersi seklindedir.

select TO_CHAR(sysdate, 'MON DD, YYYY') "Today" from dual;  //MAY 21, 2013
select TO_CHAR(100.50,'$999.99') from dual;  // $100.50

1.sorgumuzda bugunun tarihini ( Date bir degeri) sysdate ile aliyoruz, TO_CHAR fonksiyonuyla formatlayip String bir degere ceviriyoruz.
2.sorgumuzda numerik bir degeri , $ ve 9 rakami yardimi ile formatlayip String bir degere ceviriyoruz.

DECODE
Decode fonksiyonu spesifik bir degerle , bir liste yapisindaki degerleri karsilastirir. Eger eslesme saglanirsa , karsilastirilan deger doner eger eslesme saglanamazsa varsayilan (deault) deger doner. Eger varsayilan (default) deger yoksa NULL deger doner.
DECODE yapisi bir cok programlama dilinde olan CASE ve IF ELSE yapisina benzemektedir.

select customer#, state,
DECODE( state, 'CA', 0.08,
               'FL', 0.07,
                      0) "Sales Tax Rate" from customers;

oracle ders 25 03

Sales Tax Rate kolonu icin, state alani CA olan kayitlar icin 0.08  FL olan kayitlar icin 0.07 , diger sonuclar icin varsayilan olarak 0 degerini vermesini istiyoruz.

CASE
CASE fonksiyonu , DECODE fonksiyonuna benzemektedir. DECODE fonksiyonu ile yazdigimiz sorguyu CASE fonksiyonu ile yazalim.

select customer#, state,
case
when state ='CA' THEN 0.08 
when state ='FL' THEN 0.07
else 0
end "Sales Tax Rate"
from customers;

CASE fonksiyonu < > gibi operatorleri de destekler, bu sayede daha esnek olabilir.

select empno, lname,fname,
ROUND(MONTHS_BETWEEN('01-JUL-09', hiredate)/12,2) "Years",
CASE
  when (MONTHS_BETWEEN('01-JUL-09', hiredate)/12) < 4 THEN 'LEVEL1'
  when (MONTHS_BETWEEN('01-JUL-09', hiredate)/12) < 8 THEN 'LEVEL2'
  when (MONTHS_BETWEEN('01-JUL-09', hiredate)/12) < 12 THEN 'LEVEL3'
  when (MONTHS_BETWEEN('01-JUL-09', hiredate)/12) < 16 THEN 'LEVEL4'
  else 'LEVEL5'
end "Employee Level"
from employees;


SOUNDEX

SOUNDEX fonksiyonu ilginc bir fonksiyondur. Oracle SOUNDEX fonksiyonu ile kelimenin spelling(hecelenmesi) yerine fonetik telaffuzunu da dikkate alir.

select customer# , lastname, firstname
from customers where soundex(lastname) = soundex('smyth');

oracle ders 25 04

Sorgumuzda smyth i smith olarak algilayabilmekte ve sonucu getirmektedir.

TO_NUMBER
TO_NUMBER fonksiyonu String degeri numerik bir degere donusturmek icin kullanilir.

select TO_NUMBER('1000') from dual;  //1000
select TO_NUMBER( TO_CHAR(SYSDATE,'YYYY')) from dual;  //2013

1.sorguda String ‘1000’ degerini numerik 1000 degerine donusturmektedir.
2.sorguda suanki tarihi sysdate ile almaktayiz, bu ifade DATE tir. Burada TO_CHAR ile DATE degeri formatlayip String degere donusturmekteyiz, TO_NUMBER fonksiyonu ile numerik degere donusturmekteyiz.

Yazimi burada sonlandiriyorum.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *