SQL-Fall Wenn keine Null beschriftet wird

Oct 04 2020

Ich versuche dieses Leet-Code-Problem zu lösen :

Schreiben Sie eine SQL-Abfrage, um das zweithöchste Gehalt aus der Employee-Tabelle zu erhalten.

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

In Anbetracht der obigen Mitarbeitertabelle sollte die Abfrage beispielsweise 200 als zweithöchstes Gehalt zurückgeben. Wenn es kein zweithöchstes Gehalt gibt, sollte die Abfrage null zurückgeben.

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

Ich versuche diese Lösung zu geben:

SELECT 
      CASE WHEN Salary = '' 
         THEN NULL 
         ELSE Salary END SecondHighestSalary 
   FROM 
      Employee 
   ORDER BY 
      SecondHighestSalary 
   LIMIT 1,1;

Wenn es ein zweites Gehalt gibt, funktioniert es einwandfrei und gibt die Ausgabe zurück. Wenn es jedoch kein zweites Gehalt und nur ein Gehalt gibt, wird nur eine leere Zeichenfolge zurückgegeben. Ich versuche zurückzukehren NULL, aber es kehrt nicht so zurück, NULLwie ich es in meiner Abfrage geschrieben habe. Wie kann ich das beheben?

Antworten

3 Barmar Oct 04 2020 at 07:11

Ihr CASEAusdruck testet das Gehalt in jeder Zeile der Tabelle, nicht das in der LIMITKlausel ausgewählte. Die Bestellung erfolgt nach dem Generieren der Werte in der SELECTListe, da Sie nach diesen berechneten Werten sortieren können.

Da keines der Gehälter leere Zeichenfolgen sind, ist die Bedingung in Ihrem CASEniemals wahr, sodass immer der SalaryWert zurückgegeben wird. Infolgedessen entspricht Ihre Abfrage

SELECT Salary AS SecondHighestSalary
FROM Employee
ORDER BY SecondHighestSalary
LIMIT 1, 1

Andere Dinge:

  1. Sie müssen verwenden DESC, um zu Beginn das höchste Gehalt zu erhalten. Selbst wenn Ihre Methode funktionieren würde, würde sie das zweitniedrigste Gehalt finden.
  2. Ihre Methode behandelt nicht den Fall, dass mehrere Mitarbeiter für das höchste Gehalt gebunden sind. LIMIT 1, 1gibt die zweite Zeile zurück, die einer der gebundenen Mitarbeiter sein wird.

Sie können das zweite Problem mithilfe einer Unterabfrage lösen, mit der Duplikate entfernt werden:

SELECT DISTINCT Salary
FROM Employee

Eine letzte Abfrage könnte also sein:

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

Z.B

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

Sie können diese Lösung verwenden, bei der NULL zurückgegeben wird, wenn kein zweithöchstes Gehalt vorhanden ist. Andernfalls wird das zweithöchste Gehalt zurückgegeben

SELECT 
   IFNULL(MIN(Salary) , 'NULL') as SecondHighestSalary
FROM
    Employee
WHERE salary > (SELECT MIN(salary)
                 FROM Employee)

Oder wenn Sie möchten, dass der DB-Standardwert null ist, entfernen Sie einfach die IFNULL-Bedingung

SELECT 
   MIN(Salary) as SecondHighestSalary
FROM
    Employee
WHERE salary > (SELECT MIN(salary)
                 FROM Employee)