スカラー関数を使用する
スカラー関数は、1 つの値を返す関数で、通常は 1 行のデータに対して操作を行います。 受け取る入力値の数は、ゼロ (例: GETDATE)、1 個 (例: UPPER)、複数個 (例: ROUND) のいずれでもかまいません。 スカラー関数は常に 1 つの値を返すため、1 つの値 (結果) が必要な箇所であればどこでも使用できます。 SELECT 句および WHERE 句の述語で最もよく使用します。 また、UPDATE ステートメントの SET 句の中でも使用できます。
組み込みのスカラー関数は、文字列、変換、論理、数学など、さまざまなカテゴリに分類できます。 このモジュールでは、いくつかの一般的なスカラー関数について説明します。
スカラー関数を使用する場合、次のような考慮事項があります。
- 決定性: 関数が呼び出されるたびに同じ入力とデータベースの状態に対して同じ値を返す場合は、"決定的" であると言います。 たとえば、ROUND(1.1, 0) は常に値 1.0 を返します。 多くの組み込み関数は "非決定的" です。 たとえば、GETDATE() は現在の日付と時刻を返します。 非決定的関数の結果にインデックスを付けることはできません。これは、クエリを実行するための適切な計画を立てるクエリ プロセッサの機能に影響します。
- 照合順序: 文字データを操作する関数を使用するとき、どの照合順序が使用されるでしょうか。 入力値の照合順序 (並べ替え順序) を使用する関数もあれば、入力の照合順序が指定されていない場合にデータベースの照合順序を使用するものもあります。
スカラー関数の例
この執筆の時点で、SQL Server 技術ドキュメントには、次のような複数のカテゴリにわたって、200 個を超えるスカラー関数が一覧に示されています。
- 構成関数
- 変換関数
- カーソル関数
- 日付と時刻関数
- 数学関数
- メタデータ関数
- セキュリティ機能
- 文字列関数
- システム関数
- システム統計関数
- テキストとイメージ関数
このコースでは、各関数について説明する十分な時間はありませんが、一般的に使用されるいくつかの関数を以下の例に示します。
次の架空の例では、いくつかの日付と時刻関数を使用しています。
SELECT SalesOrderID,
OrderDate,
YEAR(OrderDate) AS OrderYear,
DATENAME(mm, OrderDate) AS OrderMonth,
DAY(OrderDate) AS OrderDay,
DATENAME(dw, OrderDate) AS OrderWeekDay,
DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM Sales.SalesOrderHeader;
結果の一部を次に示します。
SalesOrderID
OrderDate
OrderYear
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T00:00:00
2008
6 月
1
土曜日
13
...
...
...
...
...
...
...
次の例には、いくつかの数学関数が含まれています。
SELECT TaxAmt,
ROUND(TaxAmt, 0) AS Rounded,
FLOOR(TaxAmt) AS Floor,
CEILING(TaxAmt) AS Ceiling,
SQUARE(TaxAmt) AS Squared,
SQRT(TaxAmt) AS Root,
LOG(TaxAmt) AS Log,
TaxAmt * RAND() AS Randomized
FROM Sales.SalesOrderHeader;
結果の一部 :
TaxAmt
丸めの結果
床
Ceiling
Squared
Root
ログ
ランダム化
70.4279
70.0000
70.0000
71.0000
4960.089098
8.392133221
4.254589491
28.64120429
...
..
...
...
...
...
...
...
次の例では、いくつかの文字列関数を使用しています。
SELECT CompanyName,
UPPER(CompanyName) AS UpperCase,
LOWER(CompanyName) AS LowerCase,
LEN(CompanyName) AS Length,
REVERSE(CompanyName) AS Reversed,
CHARINDEX(' ', CompanyName) AS FirstSpace,
LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1, LEN(CompanyName)) AS RestOfName
FROM Sales.Customer;
結果の一部 :
CompanyName
UpperCase
LowerCase
長さ
Reversed
FirstSpace
FirstWord
RestOfName
A Bike Store
A BIKE STORE
a bike store
12
erotS ekiB A
2
A
Bike Store
Progressive Sports
PROGRESSIVE SPORTS
progressive sports
18
stropS evissergorP
12
プログレッシブ
スポーツ
Advanced Bike Components
ADVANCED BIKE COMPONENTS
advanced bike components
24
stnenopmoC ekiB decnavdA
9
上級
Bike Components
...
...
...
...
...
...
...
...
論理関数
別のカテゴリの関数を使用すると、複数の値のうち、どれを返すかを決定できます。 論理関数は、入力式を評価し、その結果に基づいて適切な値を返す関数です。
IIF
IIF は、ブール値の入力式を評価し、式が True と評価された場合は指定された値を返し、式が False と評価された場合は代替値を返す関数です。
たとえば、顧客の住所の種類を評価する次のクエリを考えてみます。 値が "Main Office" の場合、式により "Billing" が返されます。 その他すべての住所の種類を表す値に対して、式により "Mailing" が返されます。
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
このクエリの考えられる結果の一部を次に示します。
[アドレスの種類]
UseAddressFor
Main Office
課金
発送
Mailing
...
...
CHOOSE
CHOOSE は、整数式を評価し、その (1 から始まる) 序数の位置に基づいて、リストから対応する値を返す関数です。
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
このクエリの結果は次のようになります。
SalesOrderID
Status
OrderStatus
1234
3
配信済み
1235
2
Shipped
1236
2
Shipped
1237
1
注文済み
...
...
...