[英]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
其他事情:
DESC
才能拿到最高工资。 所以即使你的方法有效,它也会找到第二低的工资。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.