Transact-SQL リファレンス


Transact-SQL リファレンス
CAST と CONVERT

あるデータ型の式を、明示的にほかのデータ型に変換します。CAST と CONVERT は同じような機能を持っています。

構文

CAST を使用する場合

CAST ( expression AS data_type )

CONVERT を使用する場合

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

引数

expression

有効な Microsoft® SQL Server™ 式です。詳細については、「Expressions (式) 」を参照してください。

data_type

変換後のシステム提供のデータ型です。bigint 型、sql_variant 型などがあります。ユーザー定義データ型は使用できません。使用できるデータ型の詳細については、「データ型」を参照してください。

length

ncharnvarcharcharvarcharbinaryvarbinary 型のパラメータであり、省略可能です。

style

datetime または smalldatetime 型のデータを、ncharnvarcharcharvarcharnchar、または nvarchar 型などの文字型データに変換する場合の日付形式です。あるいは、floatrealmoneysmallmoney 型のデータを ncharnvarcharcharvarcharnchar、または nvarchar 型などの文字型データに変換する場合の文字列形式です。

SQL Server では、クウェート アルゴリズムを使用して、アラビア式での日付形式をサポートしています。

次の表は、左側の 2 つの列が datetime または smalldatetime 型から文字型データに変換する際の style 値を表しています。世紀を含む 4 桁の年 (yyyy) を取得するには、style の値に 100 を加えてください。

世紀
なし
(yy)
世紀
あり
(yyyy)

標準

入力/出力**
- 0 または 100 (*) 既定値 mon dd yyyy hh:miAM (または PM)
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 イギリス/フランス dd/mm/yy
4 104 ドイツ dd.mm.yy
5 105 イタリア dd-mm-yy
6 106 - dd mon yy
7 107 - Mon dd, yy
8 108 - hh:mm:ss
- 9 または 109 (*) 既定値 + ミリ秒 mon dd yyyy hh:mi:ss:mmmAM (または PM)
10 110 USA mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 または 113 (*) ヨーロッパの既定値 + ミリ秒 dd mon yyyy hh:mm:ss:mmm (24 時間制)
14 114 - hh:mi:ss:mmm
(24 時間制)
- 20 または 120 (*) ODBC 標準 yyyy-mm-dd hh:mi:ss(24 時間制)
- 21 または 121 (*) ODBC 標準 (ミリ秒を含む) yyyy-mm-dd hh:mi:ss.mmm(24 時間制)
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(スペースなし)
- 130* クウェート dd mon yyyy hh:mi:ss:mmmAM
- 131* クウェート dd/mm/yy hh:mi:ss:mmmAM

*    既定値 (style 0 または 100、9 または 109、13 または 113、20 または 120、21 または 121 ) では、常に 4 桁の年 (yyyy) を返します。
** datetime 型に変換する場合は入力、文字型データに変換するときは出力になります。
*** XML で使用するように設計されています。datetime または smalldatetime 型から character 型データへの変換の出力フォーマットは、表に示したとおりです。floatmoney、または smallmoney 型から character 型データへの変換の場合、出力は style 2 に相当します。real 型から character 型データへの変換の場合、出力は style 1 に相当します。

重要  SQL Server では、特に指定しない限り 2 桁の年は終了年 2049 に基づいて解釈されます。したがって、2 桁の 49 年は 2049 年、50 年は 1950 年と解釈されます。クライアント アプリケーションの中には、OLE オートメーション オブジェクトをベースとするクライアント アプリケーションのように、2030 年を終了年とするものが多くあります。SQL Server では、設定オプションの two digit year cutoff が用意されており、このオプションを使用して SQL Server で使用する終了年を変更し、日付の処理に一貫性を持たせることができます。とはいえ、4 桁の年を指定するのが最も安全な方法です。

smalldatetime を文字データに変換する場合、秒またはミリ秒を含むスタイルではそれらの位置に 0 が表示されます。datetimesmalldatetime の値を変換するときは、char 型や varchar 型の長さを適切に設定することにより、日付の不要な部分が切り詰められます。

次の表は、float または real 型を文字型データに変換する際の style 値を表しています。

出力
0 (既定値) 最大 6 桁。該当する場合は、科学的表記法で使用します。
1 常に 8 桁。常に科学的表記法で使用します。
2 常に 16 桁。常に科学的表記法で使用します。

次の表は、左側の列が money 型または smallmoney 型から文字型データに変換する際の style 値を表しています。

出力
0 (既定値) たとえば 4235.98 のように、小数点位置から左へ 3 桁ごとの位置にはカンマを挿入しません。また、小数点右側には 2 桁をとります。
1 たとえば 3,510.92 のように、小数点位置から左へ 3 桁ごとにカンマを挿入し、小数点右側には 2 桁をとります。
2 たとえば 4235.9819 のように、小数点位置から左へ 3 桁ごとの位置にはカンマを挿入しません。また、小数点右側には 4 桁をとります。

戻り値の型

data type 0 と同じ値を返します。

解説

暗黙の変換とは、CAST または CONVERT 関数を指定することなしに実行される変換のことです。一方、明示的な変換は、CAST (CONVERT) 関数の指定を必要とします。次の表に、bigint 型、sql_variant 型など、SQL Server システム提供のデータ型で有効なすべての明示的および暗黙のデータ型変換を示します。

  UNICODE データは常に偶数のバイト数を使用するので、binary 型または varbinary 型と、UNICODE サポートのデータ型との間でデータを変換する場合は注意してください。たとえば、次の変換を行うと、16 進数の 41 ではなく、4100 が返されます。SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

データ型の自動変換は、text 型および image 型ではサポートしていません。text 型データから文字型データへの変換、および image 型データから binary 型または varbinary 型への変換は、明示的に行うことができますが、最大の長さは 8000 です。正しくない変換を試みた場合 (たとえば、文字を含む文字式を int 型に変換する場合など) は、エラー メッセージが表示されます。

CAST または CONVERT の入出力が文字列である場合、出力は入力と同じ照合順序および照合順序ラベルを使用します。入力が文字列ではない場合、出力はデータベースの既定の照合順序、および強制可能な既定照合順序の照合順序ラベルを使用します。詳細については、「照合順序の優先順位」を参照してください。

出力に別の照合順序を割り当てるには、CAST 関数または CONVERT 関数の結果式に COLLATE 句を適用します。以下に例を示します。

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

代入時に sql_variant 型からの暗黙の変換はありませんが、sql_variant 型への暗黙の変換はあります。

charncharnvarcharvarcharbinary、または varbinary 型などの文字式やバイナリ式を異なるデータ型に変換する場合は、データを切り詰めたり、一部分だけを表示できます。また、結果が短すぎて表示できない場合は、エラーを返します。charvarcharncharnvarcharbinary、および varbinary 型に変換されたデータは、次の表に示される変換を除き、切り捨てられます。

変換前のデータ型 変換後のデータ型 結果
intsmallint、または tinyint char *
  varchar *
nchar E
nvarchar E
moneysmallmoneynumericdecimalfloat、または real char E
  varchar E
nchar E
nvarchar E

* 結果が短すぎて表示できません。
E 結果が短すぎて表示できなかったためにエラーが返されました。

Microsoft SQL Server では、元のデータから別のデータ型に変換し、再度元のデータ型に戻すラウンドトリップ変換の場合にだけ、異なるバージョンでも同じ結果が生成されることを保証しています。以下にラウンドトリップ変換の例を示します。

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

たとえば、binary 型の値を作成し、これを数値型に変換することは避けてください。SQL Server では、decimal 型または numeric 型から binary 型に変換した場合、異なるバージョンで同じ結果が生成されることを保証していません。

この例では、短すぎて表示できない結果式を示します。

USE pubs
SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles
WHERE type = 'trad_cook'

以下に結果セットを示します。

Title
------------------------- --
Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone?            *

(3 row(s) affected)

小数部の桁数の異なるデータ型間で変換を行う場合、その値は、最も近い数に切り捨てられます。たとえば、SELECT CAST(10.6496 AS int) の結果は 10 になります。

変換後のデータ型が変換前よりも小数部の桁数が少ない場合、その値は丸められます。たとえば、CAST(10.3496847 AS money) の結果は $10.3497 です。

SQL Server は、数値ではない charncharvarchar、または nvarchar 型のデータが intfloatnumeric、または decimal 型に変換されるとエラー メッセージを返します。また、空の文字列 (" ") が numeric または decimal 型に変換される場合にもエラーを返します。

バイナリ文字列データの使用

binary または varbinary 型データを文字型データに変換する際に、x に続けて奇数桁の値を指定すると、x の後ろに 0 (ゼロ) が追加され、値の桁数が偶数になります。

バイナリ データは、0 ~ 9 と A ~ F (または a ~ f) の文字から構成され、2 文字で 1 グループを形成します。バイナリ文字列の直前には、0x が必要です。たとえば、「FF」を入力する場合は、「0xFF」と入力します。最大値は 8000 バイトのバイナリ データで、各バイトが FF になります。binary 型は 16 進数データではなく、ビット パターンです。バイナリ データとして格納されたデータを 16 進数として変換および計算した場合は、正しい結果を得られないことがあります。

binary 型の長さを指定するときは、2 文字を 1 として数えます。長さ 10 を指定したときは、2 文字を 10、つまり 20 文字になります。

0x で表される空のバイナリ文字列を、バイナリ データとして格納することもできます。

A.    CAST と CONVERT の両方を使用する

以下の各例では、今年のこれまでの売り上げの最初の桁が 3 であるすべての書籍のタイトルを取得し、その ytd_sales データを char(20) 型に変換しています。

-- Use CAST.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
GO

-- Use CONVERT.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
GO

以下に各クエリの結果セットを示します。

Title                          ytd_sales
------------------------------ -----------
Cooking with Computers: Surrep 3876
Computer Phobic AND Non-Phobic 375
Emotional Security: A New Algo 3336
Onions, Leeks, and Garlic: Coo 375

(4 row(s) affected)
B.    CAST を算術演算子と共に使用する

この例では、今年のこれまでの売り上げ合計 (ytd_sales) を各書籍の価格 (price) で割り、単一列 (Copies) の値を計算しています。この結果は、最も近い整数に丸められた後、int 型に変換されます。

USE pubs
GO
SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'
FROM titles
GO

以下に結果セットを示します。

Copies
------
205
324
6262
205
102
7440
NULL
383
205
NULL
17
187
16
204
418
18
1263
273

(18 row(s) affected)
C.    CAST を使用して連結する

この例では、CAST のデータ型変換機能を使って、文字型でもバイナリ型でもない式を連結します。

USE pubs
GO
SELECT 'The price is ' + CAST(price AS varchar(12))
FROM titles
WHERE price > 10.00
GO

以下に結果セットを示します。

------------------
The price is 19.99
The price is 11.95
The price is 19.99
The price is 19.99
The price is 22.95
The price is 20.00
The price is 21.59
The price is 10.95
The price is 19.99
The price is 20.95
The price is 11.95
The price is 14.99

(12 row(s) affected)
D.    CAST を使用してテキストをさらに読みやすくする

この例では、選択リストの中で CAST を使用し、title 列を char(50) 型の列に変換して結果をさらに読みやすくしています。

USE pubs
GO
SELECT CAST(title AS char(50)), ytd_sales
FROM titles
WHERE type = 'trad_cook'
GO

以下に結果セットを示します。

                                                       ytd_sales
--------------------------------------------------     ---------
Onions, Leeks, and Garlic: Cooking Secrets of the      375
Fifty Years in Buckingham Palace Kitchens              15096
Sushi, Anyone?                                         4095

(3 row(s) affected)
E.    CAST を LIKE 句と共に使用する

この例では、int 型の列である ytd_sales 列を LIKE 句と共に使用できるよう、char(20) 型に変換しています。

USE pubs
GO
SELECT title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
   AND type = 'trad_cook'
GO

以下に結果セットを示します。

title                                                        ytd_sales
------------------------------------------------------------ -----------
Fifty Years in Buckingham Palace Kitchens                    15096

(1 row(s) affected)

関連項目

SELECT

システム関数

Page view tracker