使い勝手が向上する新しい関数
SQL Server 2012では、新たに14個のTransact-SQL関数が追加されました(表1)。その内、9つの関数はデータ型に焦点を当てたもので、型変換の関数、返す結果が型指定されている関数でデスクトップアプリケーションを意識した追加となっています。
カテゴリ | 関数 | 概要 |
変換関数 | PARSE(変換する対象文字列 AS データ型 USING カルチャー指定) |
文字列から日付時刻型、数値型への変換。 (例) 「\1000」のような文字列を「ja-jp」国指定でmoney型「1000.00」に変換。 |
TRY_CONVERT(データ型 , 変換する値) |
指定したデータ型への変換。変換に失敗するとNULLを返す。 (例) データ型をdatetime2、変換する文字列を2012/06/01とすると、datetime2に変換される。 |
|
TRY_PARSE(変換する対象文字列 AS データ型 USING カルチャー指定) | 文字列から日付時刻型、数値型への変換。PARSEは変換に失敗するとエラーになるが、こちらは変換に失敗するとNULLを返す。 | |
日付と時刻の関数 | DATEFROMPARTS(年 , 月 , 日) | 引数に渡された数字を組み立てて、DATE型を返す。 |
DATETIME2FROMPARTS(年,月,日,時間,分,秒,少数) | 引数に渡された数字を組み立てて、DATETIME2型を返す。 | |
DATETIMEFROMPARTS(年,月,日,時間,分,秒,少数) | 引数に渡された数字を組み立てて、DATETIME型を返す。 | |
DATETIMEOFFSETFROMPARTS(年,月,日,時間,分,秒,少数,タイムゾーン時間,タイムゾーン部分,有効桁数) | 引数に渡された数字を組み立てて、DATETIMEOFFSET型を返す。 | |
EOMONTH(日にち,何か月後かの指定) | 月末の日付を返す。 | |
SMALLDATETIMEFROMPARTS(年,月,日,時間,分) | 引数に渡された数字を組み立てて、SMALLDATETIME型を返す。 | |
TIMEFROMPARTS(時間,分,秒,少数,有効桁数) | 引数に渡された数字を組み立てて、TIME型を返す。 | |
論理関数 | CHOOSE(インデックス,リスト1,リスト2・・・・) | 第一引数で指定した数字番目を、第二引数以降から数えて選択する。 |
IIF(条件,Trueの時に返す値,Falseの時に返す値) | 第一引数がTRUEの場合、第二引数を返し、第一引数がFALSEの場合、第三引数を返す。 | |
文字列関数 | CONCAT(連結する文字列1,文字列2・・・・) | 引数に指定した文字列を結合した結果を返す。 |
FORMAT(対象の値,フォーマット,カルチャー指定) | 第一引数の文字列を、第三引数で指定したロケーションに対応する第二引数で指定した書式で変換した結果を返す。 |
追加された関数の内、比較的使用頻度が高くなりそうなENMONTHとCHOOSE、IIF関数について個別に使用方法を説明します。
月末日を取得できる日付計算関数ENMONTH
月末を返すENMONTH関数は、指定日が含まれた月の最後の日付を取得することができます。リスト10を実行すると、「2012-02-29」を取得できます。
SELECT EOMONTH ('2012/2/5')
ENMONTHの第2引数には、指定日に月数を追加できます。例えば、「2」を指定すると指定日の2か月後の月末を取得でき、「-3」を指定すると3か月前の月末を取得できます。リスト11は、クエリ実行日の3か月前の月末日を取得するクエリです。
SELECT EOMONTH (Getdate(),-3)
リストから番目を指定して値を取得できるCHOOSE
CHOOSE関数は、値一覧から指定したインデックスにある項目を返します。リスト12のように変数でインデックスを指定することもできます。インデックスは1からカウントされますので、このクエリを実行すると3番目の「test2」が返ってきます。プロシージャでの記述の簡潔化が期待できます。
DECLARE @targetIndex int SET @targetIndex = 3 SELECT CHOOSE(@targetIndex,'test','test1','test2','test3','test4') // 出力:test2
CASE文を簡易表記できる値取得IIF
条件がTrueかFalseかによって、2つの値のいずれかを返します。IIFはCASE文を簡略化して記述するための関数です(注2)。SQL Serverの動作的には、実行時にCASE文に暗黙的に変換されるので、記述面の簡便性のみに役立ちます。リスト13を実行すると「条件不適合」が返ってきます。
DECLARE @a int SET @a = 3 SELECT IIF(@a>5,'条件合致','条件不適合') // 出力:条件不適合
IIFは、IF~ELSEと似ていますが、IF~ELSEは実行するクエリを制御するために使用します。