[英]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.