Oracle ile veritabanı üzerinde sorgulama yaparken çeşitli kolonlarda yer alan verilerin kontrol edilmesi ve bunun sonucuna göre bir takım sonuç verilerinin üretilmesi istenebilir.
Bu durumlarda kullanım şekillerini anlatacak olduğum oracle yerel fonksiyonlarından yardım sağlayabilirsiniz.
- CASE
- NVL
- NVL2
- DECODE
- NULLIF()
- GREATEST()
- LEAST()
- COALESCE()
CASE
Bir verinin bir çok şart arasından uygun olanına göre belirli bir işleme tabi tutularak sonuç üretmesi için kullanılabilir.
Örnek:
SELECT ename, CASE WHEN sal = 1000 THEN 'İstenen Düzey' WHEN sal > 1000 THEN 'Aşırı' ELSE 'Asgari' END AS Durum FROM emp;
emp tablosundan ename ve sal kolonları okunur ve sal kolonu okunurken şayet 1000’e eşit ise İSTENEN DÜZEY,
1000’den büyük ise AŞIRI ve 1000’den küçük ise de ASGARİ bilgisinin DURUM kolonu altında yazması sağlanabilir.
NVL
NVL komutu NVL(a,b) olarak kullanılır. Şayet a kolonu NULL(boş) ise b olarak belirlenen sonuç fonksiyon sonucu olarak alınır.
Örnek:
SELECT nvl(ename, 'Sekercioglu.eu') test FROM emp;
emp tablosunda ename kolonu boş ise test kolonunda Sekercioglu.eu bilgisi görünecektir.
NVL2
NVL2 komutu NVL2(a,b,c) olarak kullanılır. Şayet a kolonu boş ise b olarak belirlenen sonuç değilse c olarak belirlenen sonuç fonksiyon sonucu olarak alınır.
Diğer bir deyişle; tablomuzda 2 farklı adres bilgisi olduğunu düşünelim ve eğer 2. adres alanı boş ise 1. adres alanının geçerli olması ve aksi halde de 2. adresin geçerli olmasını isteyelim.
SELECT NVL2(adres2,adres1,adres2) test FROM emp;
DECODE
Tabloda yer alan kolonların içeriğine göre gerektiğinde matematiksel yada string fonksiyonlardan yararlanarak işlemler yapılır ve fonksiyon sonucuna göre decode işlemine tabi tutulabilir.
Örnek olarak a ile b kolonlarının eşitlik ve büyüklük tanımlarını incelemek istediğimizde aşağıdaki gibi bir fonksiyon yazabiliriz.
Buradaki abs matematik fonksiyonu a-b matematiksel işleminin MUTLAK değerini almaya yarar.
Buna göre; DECODE (sorgulanacak veri, karşılaştırma bilgisi, sonuç,… ) sıralaması şeklinde yazılabilir. Şimdi örneğimize dönecek olursak;
select a, b, decode(abs(a-b), a-b, 'a > b', 0, 'a = b', 'a < b') from tablomuz;
işleminde tablomuz tablosundan a ve b kolonları isteniyor ve decode işlemi ile a-b nin mutlak değeri ile a-b reel değeri karşılaştırılıyor.
- Eğer mutlak ve reel değer birbirine eşit ise A>B sonucu üretiliyor.
- Eğer mutlak değer sonucu 0(SIFIR) ise A ile B eşit sonucu üretiliyor.
- Eğer tüm bu sonuçlara uymuyorsa A<B sonucu üretiliyor.
NULLIF()
NULLIF(a,b) şeklinde kullanılır. Şayet a ile b birbirine eşit ise NULL değeri üretilir.
SELECT NULLIF(isim, isim) FROM tablo;
GREATEST()
Greatest(a,b) olarak kullanılır hangi değer daha büyük ise sonuç olarak o kolon verisi döner.
Örnek;
SELECT greatest(100,200) deger from dual;
sorgusundan sonuç olarak deger kolonunda 200 verisi dönecektir.
LEAST()
LEAST(a,b) olarak kullanılır hangi değer daha küçük ise sonuç olarak o kolon verisi döner.
Örnek;
SELECT least(100,200) deger from dual;
sorgusundan sonuç olarak deger kolonunda 100 verisi dönecektir.
COALESCE()
COALECCE(a,b,c) olarak kullanılır a b ve c kolonlarından hangisinde veri varsa sırasına göre boş olmayan ilk kolondaki veri döner.
Örnek;
isim | is_tel | cep_tel | ev_tel |
Burak | 231-2531 | 322-7813 | 465-9901 |
Ada | NULL | 372-5588 | 212-4088 |
Ata | NULL | NULL | 394-7477 |
SELECT isim, COALESCE(is_tel, cep_tel, ev_tel) iletisim_numarasi FROM rehber;
sorgusunda rehber tablosundan isim, is_tel, cep_tel ve ev_tel bilgileri istenir. COALESCE işlemine göre aşağıdaki sonuç tablosu üretilir.
Sonuç:
İsim | iletisim_numarasi |
Burak | 231-2531 |
Ada | 372-5588 |
Ata | 394-7477 |
Umarım bu yazı faydalı olmuştur.
Çünkü zaman zaman bir sorgu oluşturmamız gerektiğinde çok basit sorunlarda bile takılıp kalmamız olasıdır.