null 레이블을 지정하지 않은 경우 SQL 사례
이 Leet 코드 문제를 시도하고 있습니다 .
Employee 테이블에서 두 번째로 높은 급여를 가져 오는 SQL 쿼리를 작성합니다.
+----+--------+
| 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;
두 번째 급여가 있으면 제대로 작동하고 출력을 반환합니다. 그러나 두 번째 급여가없고 급여가 하나 뿐인 경우 빈 문자열 만 반환됩니다. 나는 return을 시도하고 NULL있지만 NULL내 쿼리에서 작성한 것처럼 반환되지 않습니다 . 이 문제를 어떻게 해결할 수 있습니까?
답변
귀하의 CASE표현식은 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)