繁体   English   中英

SQL Case 不标记 null 时

[英]SQL Case When not labeling null

我正在尝试解决这个Leet Code 问题

编写 SQL 查询以从 Employee 表中获取第二高的薪水。

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

例如,给定上面的 Employee 表,查询应该返回 200 作为第二高的薪水。 如果没有第二高的薪水,则查询应返回 null。

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

我试图给出这个解决方案:

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

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

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

由于没有一个薪水是空字符串,你的CASE的条件永远不会为真,所以它总是返回Salary值。 因此,您的查询相当于

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

其他事情:

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

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

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

例如

 select max(salary) salary 
   from employee 
 where salary not in 
 (select max(salary) from employee)

您可以使用此解决方案,如果没有第二高的薪水将返回 NULL。 否则将返回第二高工资

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM