サーチ…


NULL値を含む列の操作

MySQLなどのSQL言語では、 NULL値には特殊なプロパティがあります。

雇用申請者、彼らが働いていた企業、および彼らが退社した日を含む次の表を考えてみましょう。 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 |
+--------------+-----------------+------------+

あなたの仕事は、企業でまだ働いている従業員(終了日がNULL人)を含む、 2016-01-01後のすべての行を返すクエリを作成することです。この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 。したがって、 NULL end_dateを持つ行は、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の処理はより複雑になります。あなたのタスクが各applicant_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問題の回避策が提供され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