データ型を操作する
Transact-SQL で使用される列と変数には 、それぞれデータ型があります。 式の値の動作は、参照される列または変数のデータ型によって異なります。 たとえば、前に説明したとおり、+ 演算子を使用して、2 つの文字列値を連結したり、2 つの数値を追加したりすることができます。
次の表は、SQL Server データベースでサポートされている一般的なデータ型を示しています。
真数
概数
文字
日付/時刻
バイナリ
その他
tinyint
フロート
char
date
バイナリ
カーソル (cursor)
スモールイント
real
varchar
time
varbinary
hierarchyid
INT
テキスト
DATETIME
画像
SQLバリアント
bigint(ビッグイント)
nchar
datetime2
テーブル / 表
bit
nvarchar
smalldatetime(スモールデイトタイム)
タイムスタンプ(時刻印)
decimal/numeric
ntext
datetimeoffset (デイトタイムオフセット)
UNIQUEIDENTIFIER
数値
xml
お金
地理学
少額のお金
幾何学
注
さまざまなデータ型とその属性の詳細については、 Transact-SQL リファレンス ドキュメントを参照してください。
データ型の変換
互換性のあるデータ型の値は、必要に応じて暗黙的に変換できます。 たとえば、 + 演算子を使用して 、整数 を 10 進数 に追加したり、固定長 の char 値と可変長 varchar 値を連結したりすることができます。 ただし、最初に数値を互換性のある文字列データ型に変換しない限り、 + を使用して varchar 値と 10 進 値を連結しようとすると、エラーが発生する場合があります。
注
暗黙的および明示的な変換は特定のデータ型に適用され、一部の変換は不可能です。 詳細については、 Transact-SQL リファレンス ドキュメントのグラフを使用してください。
T-SQL には、データ型間の明示的な変換に役立つ関数が含まれています
CAST と TRY_CAST
値がターゲットのデータ型と互換性がある場合、CAST 関数は値を指定されたデータ型に変換します。 互換性がない場合は、エラーが返されます。
たとえば、次のクエリでは、CAST を使用して ProductID 列の整数値を varchar 値 (最大 4 文字) に変換し、それらを別の文字ベースの値と連結します。
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
このクエリの結果は次のようになります。
ProductName
680: HL ロード フレーム - ブラック、58
706: HL ロード フレーム - 赤、58
707: Sport-100 ヘルメット, 赤
708: Sport-100 ヘルメット,ブラック
...
ただし、Production.Product テーブルの Size 列が nvarchar (可変長、Unicode テキスト データ) 列であり、一部の数値サイズ (58 など) とテキストベースのサイズ ("S"、"M"、"L" など) が含まれているとします。 次のクエリでは、この列の値を 整数 データ型に変換しようとします。
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
このクエリにより、次のエラーメッセージが発生します。
エラー: nvarchar の値 'M' をデータ型 int に変換中に、変換に失敗しました。
列の値の 少なくとも一部 が数値である場合は、それらの値を変換し、他の値を無視することができます。 TRY_CAST 関数を使用すると、データ型を変換できます。
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
今回の結果は次のようになります。
NumericSize
58
58
NULL
NULL
...
数値データ型に変換できる値は 10 進 値として返され、互換性のない値は NULL として返されます。これは、値が 不明であることを示すために使用されます。
注
NULL 値の処理に関する考慮事項については、このユニットの後半で説明します。
CONVERT と TRY_CONVERT
CAST は、データ型間で変換するための ANSI 標準 SQL 関数であり、多くのデータベース システムで使用されています。 Transact-SQL では、次に示すように、CONVERT 関数を使用することもできます。
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
この場合も、このクエリは、次のように、指定されたデータ型に変換された値を返します。
ProductName
680: HL ロード フレーム - ブラック、58
706: HL ロード フレーム - 赤、58
707: Sport-100 ヘルメット, 赤
708: Sport-100 ヘルメット,ブラック
...
CAST と同様に、CONVERT には、互換性のない値に対して NULL を 返すTRY_CONVERTバリアントがあります。
CAST よりも CONVERT を使用するもう 1 つの利点は、CONVERT には、数値と日付の値を文字列に変換するときにスタイルの書式設定を指定できるパラメーターも含まれていることです。 たとえば、次のクエリを考えてみましょう。
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
このクエリの結果は次のようになります。
販売開始日
開始日
FormattedStartDate
2002-06-01T00:00:00
2002 年 6 月 1 日午前 12:00
6/1/2002
2002-06-01T00:00:00
2002 年 6 月 1 日午前 12:00
6/1/2002
2005-07-01T00:00:00
2005 年 7 月 1 日午前 12:00
7/1/2005
2005-07-01T00:00:00
2005 年 7 月 1 日午前 12:00
7/1/2005
...
...
...
注
CONVERT で使用できる スタイルの書式設定 コードの詳細については、 Transact-SQL リファレンス ドキュメントを参照してください。
PARSE と TRY_PARSE
PARSE 関数は、数値または日付/時刻の値を表す書式設定された文字列を変換するように設計されています。 たとえば、次のクエリについて考えてみましょう (これは、テーブルの列の値ではなくリテラル値を使用しています)。
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
このクエリの結果は次のようになります。
日付値
MoneyValue
2021-01-01T00:00:00
199.99
CAST および CONVERT と同様に、PARSE には、互換性のない値を NULL として返すTRY_PARSEバリアントがあります。
注
10 進データ型または数値データ型を使用する場合は、整数に丸めるか、小数点を設定する必要があります。これは、有効桁数と小数点以下桁数で実現できます。 精度とスケールのこの概念をより深く理解するには、 Transact-SQL リファレンス ドキュメントを参照してください。
STR
STR 関数は、数値を varchar に変換します。
次に例を示します。
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
結果は次のようになります。
ProductID
料金
680
$1432.00
706
$1432.00
707
$35.00
...
...