SQL-Fall Wenn keine Null beschriftet wird
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
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:
- 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. - 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
Z.B
select max(salary) salary
from employee
where salary not in
(select max(salary) from employee)
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)