8. MS SQL 「ネスト」「日付」「NULL」関数

 


🚀 「ネスト」「日付」「NULL」関数

🧩 第1章:関数のネスト(入れ子)で複雑な処理を一度に!

「ネスト(Nesting)」とは、ある関数の処理結果を、別の関数の入力として使うことです。これにより、複数のステップを一つのSELECT文で実行できます。

1-1. ネストの基本:内側から外側へ

関数をネストする際は、内側の関数から先に評価されるというルールを思い出しましょう。

【例題】前後の空白を削除した上で、文字列の長さ(文字数)を知りたい。

SELECT
    LEN(LTRIM('   T-SQL Class')) AS CorrectLength;
  1. 内側LTRIM(' T-SQL Class') が実行され、先頭のスペースが取り除かれた 'T-SQL Class' が生まれる。

  2. 外側LEN(...) が実行され、'T-SQL Class' の長さである 11 が最終結果となる。

1-2. 複雑なネストの実行(実演)

ネストは3重、4重にもできます。作業を細かく分け、内側から順に組み立てるのがコツです。

【例】切り出した文字列を大文字化し、さらに特定の文字を置換する。

  1. 内側 (SUBSTRING): まず切り出す SUBSTRING(Name, 3, 7)

  2. 中側 (UPPER): その結果を大文字にする UPPER(SUBSTRING(Name, 3, 7))

  3. 外側 (REPLACE): 大文字化された結果に対して、特定の文字を置換する REPLACE(UPPER(SUBSTRING(Name, 3, 7)), 'E', 'x')

SELECT
    REPLACE(UPPER(SUBSTRING(Name, 3, 7)), 'E', 'x') AS Step3Result
FROM
    Production.Product;

📅 第2章:日時関数(Date and Time Functions)

日付や時刻を扱う関数は、業務で非常に頻繁に使用されます。

2-1. 現在の日時を取得する

関数役割
GETDATE()サーバーの現在の日時を返す。(よく使われる)
SYSDATETIME()GETDATE()よりもさらに高い精度(ナノ秒レベル)の日時を返す。

2-2. 日付の差を計算する:DATEDIFF

2つの日付の間にある、指定した単位(年、月、日など)の数を計算します。

構文役割
DATEDIFF(単位, 開始日, 終了日)単位(YEAR, MONTH, DAY, HOURなど)で差を計算する。

【例】1990年7月から1991年5月までの月数の差は?

SELECT DATEDIFF(MONTH, '1990-07-18', '1991-05-14');
-- 結果: 10(ヶ月)が返る。

2-3. 日付を加算/減算する:DATEADD

特定の日付に対して、指定した単位と量を加算(または減算)して、新しい日付を計算します。

構文役割
DATEADD(単位, 加算する数値, 基準日)数値にマイナスを付けると減算になる。

【例1】今日から30日後の日付は?

SELECT DATEADD(DAY, 30, GETDATE());

【例2】2013年1月26日の3週間前は?

SELECT DATEADD(WEEK, -3, '2013-01-26');
-- 結果: 2013-01-05 が返る。

🚫 第3章:NULL値処理関数(NULL Handling Functions)

NULL値(値がない状態)は、計算や表示の際に問題となることがあります。これらをきれいに処理するための関数です。

3-1. NULLを別の値に置き換える:COALESCE

複数の式を評価し、最初に見つかったNULLではない値を返します。NULLを空白やゼロなどに置き換えたいときに最も便利で、推奨される関数です。

構文役割
COALESCE(式1, 式2, ...)左から順に評価し、最初にNULLではない値を使う。

【例】MiddleNameがNULLだったら空白('')を表示する

SELECT
    FirstName,
    COALESCE(MiddleName, '') AS MiddleNameClean, -- NULLの場合、''に変換
    LastName
FROM
    Person.Person;

3-2. 2つの値が同じ場合にNULLを返す:NULLIF

2つの式を比較し、値が同じ場合NULLを返します。

構文役割
NULLIF(式1, 式2)式1と式2が同じ NULL を返す。式1と式2が異なる 式1 の値を返す。

【例】請求先住所IDと配送先住所IDが同じだったらNULLを返す

SELECT
    BillToAddressID,
    ShipToAddressID,
    NULLIF(BillToAddressID, ShipToAddressID) AS IsSameAddress
FROM
    Sales.SalesOrderHeader;
-- 2つのIDが同じ場合、IsSameAddress列はNULLになる。

このNULLIFの結果をCOALESCEでさらに包む(ネストする)ことで、「住所IDが同じ場合は『同じ』と表示する」などの複雑な処理も簡単に実現できます。