Caso SQL cuando no se etiqueta como nulo

Oct 04 2020

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

3 Barmar Oct 04 2020 at 07:11

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:

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

P.ej

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

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)