15 Aralık 2011 Perşembe

Oracle PL/SQL Soru & Cevaplar 3: Boş kaydedilen karakter değeri ile null değeri arasında ne fark vardır?

Soru: Boş kaydedilen karakter değeri ile null değeri arasında ne fark vardır? Bir alan üzerinden  ='' şeklinde boş bir string sorguladığımda ve null değerleri sorguladığımda farklı değerler elde ediyorum.


Cevap: Boş bir string Oracle'da null bir değeri temsil eder.

Aşağıda oluşturulan kullanici tablosu üzerinden örnek vermek gerekirse.

create table kullanici(kullanici_id number, kullanici_adi varchar2(100));

Şimdi oluşturduğumuz tabloya sırasıyla boş bir değer içeren ve null değeri içeren iki kayıt ekleyelim.

insert into test (kullanici_id, kullanici_adi) values (100, null);
insert into test (kullanici_id, kullanici_adi) values (101, '');


İlk insert cümlesi tabloya kullanici_adi null olan bir değer eklemektedir.
İkinci insert cümlesi ise tabloya boş bir karakter değeri eklemektedir. (iki tek tırnak birleşik şekilde)

Şimdi eklediğimiz değerler üzerinden tablodan sorgu alalım.

Select * from kullanici where kullanici adi = '';

Sorgu sonucu olarak yukarıda boş olarak eklediğimiz değerin dönmesini bekliyoruz fakat sorgu sonucu hiç bir satır getirmeyecektir.

Birde aynı tablodan kullanici adi null olan bilgileri sorgulayalım.

Select * from kullanici where kullanici_adi is null;

Sorgu sonucu olarak eklediğimiz null değeri içeren 1 satır dönmesini bekliyoruz fakat 2 satır döndüğünü görüyoruz.
Bunun sonucu olarak Oracle da boş karakter olarak eklenen değerlerin tablo içerisinde null değerlere eşit olduğunu görüyoruz.

Sırası gelmişken bahsetmekte fayda var, null değerler içeren tablolarda kullanmaya alışkın olduğumuz (=,<,>,v.s.) gibi eşitlik ifadelerini kullanamayız. Bunların yerine null işlemleri için is null veya is not null ifadelerini kullanabiliriz.
Daha karmaşık sorgular için ise Oracle'daki null kontrolü yapan çeşitli fonksiyonları (NULLIF, NVL, NVL2) kullanabiliriz. Bu fonksiyonlar hakkında daha detaylı bilgi için "Oracle NULL Kontrol Fonksiyonları" başlıklı yazıya göz atabilirsiniz.

5 Aralık 2011 Pazartesi

Oracle PL/SQL Soru & Cevaplar 2: Bir tablo içerisindeki çiftleyen/duplicate/tekrarlayan değerleri bulup nasıl silebilirim?

Oracle'da tüm tablolar üzerinde default tanımlı olan rowid alanı sayesinde bir tablo içerisinden belirli bir set seçip ve bu seti de rowid alanı üzerinden taşıyarak çiftleyen/duplicate/tekrarlayan kayıtları silebiliriz.

Bu yöntem için yazılmış olan aşağıdaki sql ifadesini incelediğimizde, sorgunun iç kısmındaki select ifadesinde KULLANICI tablosunda bulunan ID değerlerini grupladığını ve bu değerler arasından rowid değeri minimum olan değeri aldığını görüyoruz, ifadenin asıl silme işlemini yapan delete kısmında ise iç sorgudan dönen minimum rowid değerlerinin dışındaki tüm kayıtları NOT IN ifadesi kullanarak silmeye çalıştığını görüyoruz.



 

DELETE FROM KULLANICI WHERE rowid not in
(SELECT MIN(rowid) FROM KULLANICI K GROUP BY K.ID );

Popüler Yayınlar