データ型を操作する
Transact-SQL で使用される列と変数には、それぞれ "データ型" があります。 式の値の動作は、参照される列または変数のデータ型によって異なります。 たとえば、前に説明したとおり、+ 演算子を使用して、2 つの文字列値を連結したり、2 つの数値を追加したりすることができます。
次の表は、SQL Server データベースでサポートされている一般的なデータ型を示しています。
真数
概数
文字
日付/時刻
Binary
その他
tinyint
float
char
date
binary
カーソル (cursor)
smallint
real
varchar
time
varbinary
hierarchyid
INT
text
DATETIME
image
sql_variant
bigint
nchar
datetime2
table
bit
nvarchar
smalldatetime
timestamp
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
numeric
xml
money
geography
smallmoney
geometry
Note
さまざまなデータ型とその属性の詳細については、「Transact-SQL のリファレンス ドキュメント」を参照してください。
データ型の変換
互換性のあるデータ型の値は、必要に応じて暗黙的に変換できます。 たとえば、+ 演算子を使用すると、"+" を "10 進数" に追加するか、または固定長の char 値と可変長の varchar 値を連結することができます。 ただし、場合によっては、値をあるデータ型から別のデータ型に明示的に変換することが必要になります。たとえば、+ を使用して varchar 値と decimal 値を連結しようとすると、最初に数値を互換性のある文字列データ型に変換しない限り、エラーが発生します。
注意
暗黙的および明示的な変換は特定のデータ型に適用され、一部の変換は不可能です。 詳細については、「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 Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
ただし、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 Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
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;
このクエリの結果は次のようになります。
SellStartDate
StartDate
FormattedStartDate
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
...
...
...
Note
CONVERT で使用できる "スタイル書式設定" コードの詳細については、「Transact-SQL のリファレンス ドキュメント」を参照してください。
PARSE と TRY_PARSE
PARSE 関数は、数値または日付/時刻の値を表す書式設定された文字列を変換するように設計されています。 たとえば、次のクエリについて考えてみましょう (これは、テーブルの列の値ではなくリテラル値を使用しています)。
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
このクエリの結果は次のようになります。
DateValue
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
Price
680
$1432.00
706
$1432.00
707
$35.00
...
...