Caso SQL cuando no se etiqueta como nulo
Estoy tratando de hacer este problema con el código Leet :
Escriba una consulta SQL para obtener el segundo salario más alto de la tabla de empleados.
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
Por ejemplo, dada la tabla Empleado anterior, la consulta debería devolver 200 como el segundo salario más alto. Si no hay un segundo salario más alto, la consulta debería devolver un valor nulo.
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
Estoy tratando de dar esta solución:
SELECT
CASE WHEN Salary = ''
THEN NULL
ELSE Salary END SecondHighestSalary
FROM
Employee
ORDER BY
SecondHighestSalary
LIMIT 1,1;
Cuando hay un segundo salario, funciona bien y devuelve el resultado. Sin embargo, cuando no hay un segundo salario y solo hay un salario, solo se devuelve una cadena vacía. Estoy tratando de regresar NULL, sin embargo, no regresa NULLcomo lo que escribí en mi consulta. ¿Cómo puedo arreglar esto?
Respuestas
Su CASEexpresión está probando el salario en cada fila de la tabla, no el seleccionado por la LIMITcláusula. El orden se realiza después de generar los valores en la SELECTlista, ya que puede ordenar por esos valores calculados.
Dado que ninguno de los salarios son cadenas vacías, la condición en su CASEnunca será verdadera, por lo que siempre devuelve el Salaryvalor. Como resultado, su consulta es equivalente a
SELECT Salary AS SecondHighestSalary
FROM Employee
ORDER BY SecondHighestSalary
LIMIT 1, 1
Otras cosas:
- Necesita usar
DESCpara obtener el salario más alto al principio. Entonces, incluso si su método funcionara, encontraría el segundo salario más bajo . - Su método no maneja el caso en el que varios empleados están empatados por el salario más alto.
LIMIT 1, 1devolverá la segunda fila, que será uno de los empleados empatados.
Puede resolver el segundo problema utilizando una subconsulta que elimina los duplicados:
SELECT DISTINCT Salary
FROM Employee
Entonces, una consulta final podría ser:
SELECT IF(COUNT(*) > 0, MAX(Salary), NULL) AS SecondHighestSalary
FROM (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1
) AS x
P.ej
select max(salary) salary
from employee
where salary not in
(select max(salary) from employee)
Puede usar esta solución, donde si no tiene un segundo salario más alto, devolverá NULL. De lo contrario, devolverá el segundo salario más alto
SELECT
IFNULL(MIN(Salary) , 'NULL') as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)
O si desea DB predeterminado nulo, simplemente elimine la condición IFNULL
SELECT
MIN(Salary) as SecondHighestSalary
FROM
Employee
WHERE salary > (SELECT MIN(salary)
FROM Employee)