수색…


NULL 값을 포함하는 열로 작업하기

MySQL과 다른 SQL 언어에서 NULL 값은 특별한 속성을 가지고있다.

구직 신청자, 그들이 일한 회사 및 회사를 떠난 날짜를 포함하는 다음 표를 고려하십시오. NULL 은 신청자가 회사에서 계속 근무하고 있음을 나타냅니다.

CREATE TABLE example
(`applicant_id` INT, `company_name` VARCHAR(255), `end_date` DATE);

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            1 | Google          | NULL       |
|            1 | Initech         | 2013-01-31 |
|            2 | Woodworking.com | 2016-08-25 |
|            2 | NY Times        | 2013-11-10 |
|            3 | NFL.com         | 2014-04-13 |
+--------------+-----------------+------------+

귀하의 작업은 2016-01-01 이후 모든 행을 반환하는 쿼리를 작성하는 것입니다. 여기에는 회사에서 계속 작업중인 직원 (종료 날짜가 NULL 직원)이 포함됩니다. 이 select 문은 다음과 같습니다.

SELECT * FROM example WHERE end_date > '2016-01-01';

NULL 값을 가진 행을 포함하지 못합니다.

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+

MySQL 문서 에 따르면 산술 연산자 <,>, = 및 <> 자체를 사용한 비교는 부울 TRUE 또는 FALSE 대신 NULL 을 반환 FALSE . 따라서 end_date가 NULL 행은 2016-01-01보다 크지 않고 2016-01-01보다 작지 않습니다.

이것은 IS NULL 키워드를 사용하여 해결할 수 있습니다.

SELECT * FROM example WHERE end_date > '2016-01-01' OR end_date IS NULL;

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            1 | Google          | NULL       |
|            2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+

MAX()GROUP BY 절과 같은 집계 함수가 작업에 포함되는 경우 NULL을 사용하여 작업하는 것이 더 복잡해집니다. 귀하의 업무가 각각의 신청자 ID에 대해 가장 최근에 고용 된 날짜를 선택하는 것이라면, 다음 쿼리는 논리적 인 첫 시도로 보일 것입니다 :

SELECT applicant_id, MAX(end_date) FROM example GROUP BY applicant_id;

+--------------+---------------+
| applicant_id | MAX(end_date) |
+--------------+---------------+
|            1 | 2013-01-31    |
|            2 | 2016-08-25    |
|            3 | 2014-04-13    |
+--------------+---------------+

그러나 NULL 알면 신청자가 아직 회사에 고용되어 있다는 것을 나타내므로 결과의 첫 번째 행은 정확하지 않습니다. CASE WHEN 사용하면 NULL 문제를 해결할 수 있습니다.

 SELECT
    applicant_id,
    CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END
    max_date
FROM example
GROUP BY applicant_id;

+--------------+------------+
| applicant_id | max_date   |
+--------------+------------+
|            1 | present    |
|            2 | 2016-08-25 |
|            3 | 2014-04-13 |
+--------------+------------+

이 결과는 신청자가 마지막으로 일한 회사를 결정하기 위해 원래 example 표와 다시 결합 할 수 있습니다.

SELECT 
  data.applicant_id,
  data.company_name,
  data.max_date
FROM (
  SELECT 
    *,
    CASE WHEN end_date is null THEN 'present' ELSE end_date END max_date
  FROM example
) data
INNER JOIN (
 SELECT
   applicant_id,
   CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END max_date
 FROM
   example
 GROUP BY applicant_id
) j
ON data.applicant_id = j.applicant_id AND data.max_date = j.max_date;

+--------------+-----------------+------------+
| applicant_id | company_name    | max_date   |
+--------------+-----------------+------------+
|            1 | Google          | present    |
|            2 | Woodworking.com | 2016-08-25 |
|            3 | NFL.com         | 2014-04-13 |
+--------------+-----------------+------------+

이것은 MySQL에서 NULL 값으로 작업하는 몇 가지 예입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow