SQL Durumu null etiketlenmediğinde

Oct 04 2020

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

3 Barmar Oct 04 2020 at 07:11

İş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:

  1. 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 .
  2. 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
Strawberry Oct 04 2020 at 06:11

Örneğin

 select max(salary) salary 
   from employee 
 where salary not in 
 (select max(salary) from employee)
Runa Oct 04 2020 at 06:45

İ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)