概要:このチュートリアルでは、SQL NULLIF関数を使用してクエリにロジックを追加する方法を学びます。
SQL NULLIF関数の紹介
COALESCE
関数に加えて、SQLにはNULLIF
関数が用意されています。これは、制御フロー関数であり、引数をテストし、評価結果に基づいて最初の引数またはNULL
のいずれかを返します。
NULLIF
関数は2つの引数を受け入れます。2つの引数が等しい場合、NULLIF
関数はNULL
を返し、それ以外の場合は最初の引数を返します。
以下に、NULLIF
関数の構文を示します。
NULLIF(argument_1,argument_2);
Code language: SQL (Structured Query Language) (sql)
NULLIF
関数は、以下の検索されたCASE
式と同等です。
CASE WHEN argument_1 = argument_2
THEN NULL
ELSE
argument_1
END;
Code language: SQL (Structured Query Language) (sql)
この式は、2つの引数が等しい場合はNULL
を返し、それ以外の場合はargument_1
を返します。
SQL NULLIF関数の例
次のステートメントは、100が100と等しいため、NULL
を返します。
SELECT NULLIF(100,100);
Code language: SQL (Structured Query Language) (sql)
次のステートメントは、100が200より小さいため、100を返します。NULLIF
関数は、最初の引数である100を返します。
SELECT NULLIF(100,200);
Code language: SQL (Structured Query Language) (sql)
次のステートメントは、100がNULL
と等しくないため、100を返します。
SELECT NULLIF(100,NULL);
Code language: SQL (Structured Query Language) (sql)
次のステートメントはNULL
を返します。NULL
は100と等しくないため、NULLIF
関数はNULL
ではない最初の引数を返します。
SELECT(NULL,100);
Code language: SQL (Structured Query Language) (sql)
次のステートメントは、文字列SQ
が文字列SQL
と等しいため、SQL
リテラル文字列を返します。
SELECT NULLIF('SQL','SQL');
Code language: SQL (Structured Query Language) (sql)
NULLIF
関数を適用できる実際のケースを示すために、articles
という名前の新しいテーブルを作成します。
CREATE TABLE articles (
article_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
excerpt VARCHAR(255),
body TEXT
);
Code language: SQL (Structured Query Language) (sql)
次のINSERT
ステートメントは、articles
テーブルにいくつかの行を挿入します。
INSERT INTO articles(title,excerpt,body)
VALUES('SQL NULLIF function','', 'This tutorial shows you how to use the SQL NULLIF function'),
('SQL tutorial','Learn how to use SQL at sqltutorial.org', 'You will learn SQL with practical examples'),
('SQL query',null, 'You will learn how to use SELECT statement to query data from tables');
Code language: SQL (Structured Query Language) (sql)
概要ページに記事のタイトルと抜粋を表示したいとします。これを行うには、次のようにarticle_id
、title
、およびexcerpt
をクエリします。
SELECT
article_id,
title,
excerpt
FROM
articles;
Code language: SQL (Structured Query Language) (sql)

except
が利用できない場合は、代わりにbody
の最初の50文字を使用できると仮定します。これを行うには、COALESCE
関数を使用して、NULL
でない場合はexcerpt列を返し、それ以外の場合はbody
の最初の50文字を返します。
SELECT
article_id,
title,
COALESCE(excerpt, LEFT(body, 50)) AS summary
FROM
articles;
Code language: SQL (Structured Query Language) (sql)

ここで少し問題があります。
概要列は、記事ID 1では空白です。この問題を解決するために、推測できるかもしれませんが、NULLIF
関数を使用します。
SELECT
article_id,
title,
COALESCE(NULLIF(excerpt,''), LEFT(body, 50)) AS summary
FROM
articles;
Code language: SQL (Structured Query Language) (sql)

抜粋が空の場合、NULLIF
関数はNULL
を返し、それ以外の場合は抜粋を返します。残りはCOALESCE
関数によって処理されます。
これで、NULLIF
関数がどのように機能し、クエリをより柔軟にするためにいつ適用するかを理解できたはずです。