SQL Case When not labeling null

SQL Case When not labeling null

我正在尝试这样做 Leet Code Problem:

编写一个 SQL 查询以从员工 table 获得第二高的薪水。

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

例如,给定上面的员工 table,查询应该 return 200 作为第二高的薪水。如果没有第二高的薪水,那么查询应该return null.

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

我正在尝试给出这个解决方案:

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

当有第二份薪水时,它工作正常并且 returns 输出。但是,当没有第二份薪水并且只有一份薪水时,只会 returned 一个空字符串。我正在尝试 return NULL,但是,它并不像我在查询中写的那样 return NULL。我该如何解决这个问题?

w=12=WILL.y.w=11=w w=10=sh

您可以使用此解决方案,如果没有第二高的薪水,则 return NULL。否则会return第二高薪

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

或者,如果您希望数据库默认为 null,则只需删除 IFNULL 条件

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

您的 CASE 表达式正在测试 table 的每一行中的薪水,而不是 LIMIT 子句选择的行。 生成 SELECT 列表中的值后完成排序,因为您可以按这些计算值排序。

由于 none 的薪水是空字符串,您 CASE 中的条件永远不会为真,因此它始终 return 是 Salary 值。因此,您的查询等同于

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

其他:

  1. 你需要用DESC来获得最开始的最高薪水。所以即使你的方法奏效,它也会找到第二个最低的薪水。
  2. 您的方法无法处理多个员工获得最高薪水的情况。 LIMIT 1, 1 将 return 第二行,这将是绑定的员工之一。

您可以使用删除重复项的子查询来解决第二个问题:

SELECT DISTINCT Salary
FROM Employee

所以最终查询可以是:

SELECT IF(COUNT(*) > 0, MAX(Salary), NULL) AS SecondHighestSalary
FROM (
    SELECT DISTINCT Salary
    FROM Employee
    ORDER BY Salary DESC
    LIMIT 1, 1
) AS x