SQL Durumu null etiketlenmediğinde
Bu Leet Code Problemini yapmaya çalışıyorum :
Çalışan tablosundan ikinci en yüksek maaşı almak için bir SQL sorgusu yazın.
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
Örneğin, yukarıdaki Çalışan tablosu verildiğinde, sorgu ikinci en yüksek maaş olarak 200 döndürmelidir. İkinci en yüksek maaş yoksa, sorgu boş döndürmelidir.
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
Bu çözümü vermeye çalışıyorum:
SELECT
CASE WHEN Salary = ''
THEN NULL
ELSE Salary END SecondHighestSalary
FROM
Employee
ORDER BY
SecondHighestSalary
LIMIT 1,1;
İkinci bir maaş olduğunda, iyi çalışıyor ve çıktıyı geri veriyor. Ancak, ikinci bir maaş olmadığında ve yalnızca bir maaş olduğunda yalnızca boş bir dize döndürülür. Geri dönmeye çalışıyorum NULL, ancak NULLsorgumda yazdığım gibi dönmüyor . Bunu nasıl düzeltebilirim?
Yanıtlar
İşletme CASEsentezleme tablo tarafından değil seçilmiş bir, her satırda maaş test edilir LIMITmadde. Bu hesaplanan değerlere göre sıralama yapabileceğiniz için , listedeki değerler oluşturulduktan sonra sıralama yapılır SELECT.
Maaşların hiçbiri boş dizeler olmadığından, sizdeki koşul CASEasla doğru olmayacaktır, bu nedenle her zaman Salarydeğeri döndürür . Sonuç olarak, sorgunuz şuna eşdeğerdir:
SELECT Salary AS SecondHighestSalary
FROM Employee
ORDER BY SecondHighestSalary
LIMIT 1, 1
Diğer şeyler:
DESCBaşlangıçta en yüksek maaşı almak için kullanmalısınız . Yani yönteminiz işe yarasa bile, ikinci en düşük maaşı bulacaktır .- Yönteminiz, birden fazla çalışanın en yüksek maaş için bağlı olduğu durumu işlemez.
LIMIT 1, 1bağlı çalışanlardan biri olacak ikinci sırayı döndürür.
Yinelenenleri kaldıran bir alt sorgu kullanarak ikinci sorunu çözebilirsiniz:
SELECT DISTINCT Salary
FROM Employee
Yani son bir sorgu şu olabilir:
SELECT IF(COUNT(*) > 0, MAX(Salary), NULL) AS SecondHighestSalary
FROM (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1
) AS x
Örneğin
select max(salary) salary
from employee
where salary not in
(select max(salary) from employee)
İkinci en yüksek maaş yoksa NULL döndüren bu çözümü kullanabilirsiniz. Aksi takdirde ikinci en yüksek maaşı iade eder
SELECT
IFNULL(MIN(Salary) , 'NULL') as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)
Veya DB varsayılan boş değerini istiyorsanız, o zaman sadece IFNULL koşulunu kaldırın
SELECT
MIN(Salary) as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)