🚀 「ネスト」「日付」「NULL」関数
🧩 第1章:関数のネスト(入れ子)で複雑な処理を一度に!
「ネスト(Nesting)」とは、ある関数の処理結果を、別の関数の入力として使うことです。これにより、複数のステップを一つのSELECT文で実行できます。
1-1. ネストの基本:内側から外側へ
関数をネストする際は、内側の関数から先に評価されるというルールを思い出しましょう。
【例題】前後の空白を削除した上で、文字列の長さ(文字数)を知りたい。
SELECT
LEN(LTRIM(' T-SQL Class')) AS CorrectLength;
内側の
LTRIM(' T-SQL Class')が実行され、先頭のスペースが取り除かれた'T-SQL Class'が生まれる。外側の
LEN(...)が実行され、'T-SQL Class'の長さである 11 が最終結果となる。
1-2. 複雑なネストの実行(実演)
ネストは3重、4重にもできます。作業を細かく分け、内側から順に組み立てるのがコツです。
【例】切り出した文字列を大文字化し、さらに特定の文字を置換する。
内側 (SUBSTRING): まず切り出す →
SUBSTRING(Name, 3, 7)中側 (UPPER): その結果を大文字にする →
UPPER(SUBSTRING(Name, 3, 7))外側 (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. 現在の日時を取得する
2-2. 日付の差を計算する:DATEDIFF
2つの日付の間にある、指定した単位(年、月、日など)の数を計算します。
【例】1990年7月から1991年5月までの月数の差は?
SELECT DATEDIFF(MONTH, '1990-07-18', '1991-05-14');
-- 結果: 10(ヶ月)が返る。
2-3. 日付を加算/減算する: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を空白やゼロなどに置き換えたいときに最も便利で、推奨される関数です。
【例】MiddleNameがNULLだったら空白('')を表示する
SELECT
FirstName,
COALESCE(MiddleName, '') AS MiddleNameClean, -- NULLの場合、''に変換
LastName
FROM
Person.Person;
3-2. 2つの値が同じ場合にNULLを返す:NULLIF
2つの式を比較し、値が同じ場合にNULLを返します。
【例】請求先住所IDと配送先住所IDが同じだったらNULLを返す
SELECT
BillToAddressID,
ShipToAddressID,
NULLIF(BillToAddressID, ShipToAddressID) AS IsSameAddress
FROM
Sales.SalesOrderHeader;
-- 2つのIDが同じ場合、IsSameAddress列はNULLになる。
このNULLIFの結果をCOALESCEでさらに包む(ネストする)ことで、「住所IDが同じ場合は『同じ』と表示する」などの複雑な処理も簡単に実現できます。
