SQL Notları 3 – “CASE” SATIR SAYDIR
Case ile Satır Sayısını Saydırmak
CASE YAPISI
CASE if-then mantığını uygulamak için kullanılır. Programlamada “case yapısı” (ya da “switch-case yapısı”) belirli bir değere göre kodun belirli bloklarının çalıştırılmasını sağlayan bir kontrol yapısıdır. switch-case
yapısı, genellikle birçok if-else if-else ifadesi kullanmak yerine daha okunabilir ve düzenli bir yapı sunar. Farklı programlama dillerinde benzer şekillerde kullanılsa da, söz dizimi dilin kurallarına bağlı olarak değişebilir. SQL (Structured Query Language), ilişkisel veritabanı yönetim sistemleri (RDBMS) ile veri yönetimi ve manipülasyonu için kullanılan bir dildir. SQL, veritabanlarındaki verileri sorgulamak, güncellemek, eklemek ve silmek için standart bir dil olarak kabul edilir. Ayrıca, veritabanı tablolarının ve şemalarının oluşturulması, değiştirilmesi ve yönetilmesi gibi çeşitli veritabanı işlemleri için de kullanılır.
CASE input_expression
WHEN compare1 THEN result1
[WHEN compare2 THEN result2]...
[ELSE resultX]
END
veya
CASE
WHEN condition1 THEN result1
[WHEN condition2 THEN result2]...
[ELSE resultX]
END
Notlar
Basit CASE ifadesi, input_expression
değeri ile eşit olan ilk sonucu döner.
Aranan CASE ifadesi, conditionX
değeri doğru olan ilk sonucu döner.
Örnekler
Aranan CASE (Boolean ifadeye göre) Aranan CASE, bir boolean ifade TRUE olduğunda sonuç döner. Bu, sadece eşitlik kontrolü yapan basit CASE’den farklıdır.
SELECT Id, ItemId, Price,
CASE
WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
Sonuç:
Id | ItemId | Price | PriceRating |
---|---|---|---|
1 | 100 | 34.5 | EXPENSIVE |
2 | 145 | 2.3 | CHEAP |
3 | 100 | 34.5 | EXPENSIVE |
4 | 100 | 34.5 | EXPENSIVE |
5 | 145 | 10 | AFFORDABLE |
CASE ile Satır Sayısını Saymak CASE, SUM ile birlikte kullanılarak belirli bir koşula uyan öğelerin sayısını döndürebilir. Bu, Excel’deki COUNTIF’e benzer.
Örneğin, “Expensive” olarak kategorize edilen öğelerin toplam sayısını öğrenmek istiyorsunuz:
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Sonuç:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
Alternatif:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Shorthand CASE in SELECT CASE’in kısa versiyonu, bir ifadeyi (genellikle bir sütunu) bir dizi değerle karşılaştırır. Bu versiyon biraz daha kısa olup, tekrar tekrar değerlendirilen ifadeyi kaydeder.
SELECT Id, ItemId, Price,
CASE Price
WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
Dikkat edilmesi gereken bir nokta, kısa versiyonda tüm ifadenin her WHEN’de değerlendirilmesidir. Bu, şu sonucu verebilir:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
Bu durum, NULL sonuç dönebilir çünkü her WHEN’de NEWID()
yeniden çağrılmaktadır.
ORDER BY’de CASE Kullanımı ORDER BY’de sıralama türünü belirlemek için 1,2,3… kullanılabilir:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
UPDATE’de CASE Kullanımı Fiyat artışlarına örnek:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
NULL Değerleri Sıralamak İçin CASE Kullanımı NULL değerleri en son sıralamak için:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
İki Sütunun En Düşük Değerine Göre Sıralama İki sütundan birinin en düşük değerine göre sıralama yapmak istiyorsanız:
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
Sonuçlar:
Id | Date1 | Date2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
3 | 2017-01-31 | 2017-01-02 |
2 | 2017-01-31 | 2017-01-03 |
6 | 2017-01-04 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
4 | 2017-01-06 | 2017-01-31 |
Açıklama: Id = 1 olan satır ilk sıradadır çünkü Date1, tablodaki en düşük tarihtir. Id = 3 olan satır ise Date2’nin 2017-01-02 tarihi ile ikinci en düşük değer olması nedeniyle ikinci sıradadır. Bu şekilde, kayıtlar en düşük tarihten en yüksek tarihe doğru sıralanır.