Oracle'ın temel farkları
SELECT SYSDATE AS simdi,
TO_CHAR(DATE '2024-05-17', 'DD.MM.YYYY') AS tr_tarih,
NVL(NULL, 'yok') AS nvl_ornek,
NVL2('x', 'dolu', 'bos') AS nvl2_ornek,
DECODE('B', 'A', 'Elma', 'B', 'Armut', 'Diğer') AS decode_ornek
FROM dual;
- DUAL: Oracle'da her SELECT bir FROM ister; tek satırlık yardımcı tablo
dual'dır. - NVL / NVL2 / DECODE: ISNULL, CASE benzeri Oracle fonksiyonları.
- DATE tipi saat de içerir; sabit tarihler için
DATE '2024-05-17'veyaTO_DATE('17.05.2024', 'DD.MM.YYYY').
Boş metin NULL'dır
SELECT CASE WHEN '' IS NULL THEN 'Boş metin NULL sayılır' ELSE 'Değil' END AS sonuc,
'Ad' || NULL || 'Soyad' AS birlestirme
FROM dual;
Oracle'da '' ile NULL aynıdır ve || NULL'ı yok sayar. Diğer SQL türlerinden taşınan kodlarda sık hata kaynağıdır.
ROWNUM ve FETCH FIRST
-- Eski yöntem: önce sırala, sonra ROWNUM ile kes SELECT * FROM ( SELECT name, price FROM products ORDER BY price DESC ) WHERE ROWNUM <= 3;
ROWNUM, ORDER BY'dan önce atanır; bu yüzden sıralı ilk N için alt sorgu gerekir. 12c ve sonrasında FETCH FIRST 3 ROWS ONLY kullan.
Hiyerarşik sorgu: CONNECT BY
SELECT LEVEL AS seviye, LPAD(' ', 2 * (LEVEL - 1)) || first_name AS calisan
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR emp_id = manager_id;
Oracle'ın özyinelemeli CTE'den önceki hiyerarşi sözdizimidir; hâlâ çok yaygındır. Bu taklitte çalıştırılamaz; aynı sonucu özyinelemeli WITH ile alabilirsin.