簡體   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