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
其他:
- 你需要用
DESC
来获得最开始的最高薪水。所以即使你的方法奏效,它也会找到第二个最低的薪水。
- 您的方法无法处理多个员工获得最高薪水的情况。
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
我正在尝试这样做 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
。我该如何解决这个问题?
您可以使用此解决方案,如果没有第二高的薪水,则 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
其他:
- 你需要用
DESC
来获得最开始的最高薪水。所以即使你的方法奏效,它也会找到第二个最低的薪水。 - 您的方法无法处理多个员工获得最高薪水的情况。
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