構文の宣言
CAST(expr AS type)
説明
CAST()は、あるデータ型の式を別のデータ型に明示的に変換します。つまり、exprフィールド値をtypeデータ型に変換します。
パラメータの説明
パラメータの説明は以下のとおりです:
expr:任意の有効なSQL式を表します。AS:2つのパラメータを区切るために使用されます。ASの前が処理対象のデータ、ASの後が変換対象のデータ型です。type:ターゲットシステムが提供するデータ型を表します。サポートされている型は以下のとおりです:CHAR[(N)] [CHARACTER SET charset_name]CHARデータ型の文字列を生成します。式exprが空(長さ0)の場合、結果型はCHAR(0)となります。オプションの長さNを指定した場合、CHAR(N)はN個以下の文字を使用して強制的に変換され、Nより短い値は補完されません。オプションの長さNを指定しない場合、OceanBaseデータベースは式に基づいて最大長を計算します。CHARACTER SET charset_name句がない場合、CHARはデフォルトの文字セットを持つ文字列を生成します。DATE:DATE値を生成します。DATETIME [ (M) ]:DATETIME値を生成します。M値はオプションで、小数点以下の秒の精度を指定します。範囲は [0,6] です。DECIMAL [ (M [,D] ) ]:DECIMAL値を生成します。MとD値はオプションで、それぞれ最大桁数(精度)と小数点以下の桁数(小数部の桁数)を指定します。Mの最大値は65、Dの最大値は30です。Dを省略した場合、デフォルトは0です。Mを省略した場合、デフォルトは10です。SIGNED [INTEGER]:符号付きのBIGINT値を生成します。JSON:JSON値を生成します。JSONと他の型との値の変換ルールについては、JSONデータ型の変換を参照してください。TIME [ (M) ]:TIME値を生成します。オプションのM値が指定されている場合、小数点以下の秒の精度を指定します。UNSIGNED [INTEGER]:符号なしのBIGINT値を生成します。DECIMAL(m,d):固定小数点数型で、mは総桁数を、dは小数点以下の桁数を表します。FLOAT:単精度浮動小数点数を表し、近似値に適しています。INTまたはINTEGER:32ビット符号付き整数を表します。SMALLINT:16ビット符号付き整数を表します。TINYINT:8ビット符号付き整数を表します。ARRAY:JSON配列内の要素を特定の型の配列に変換するために使用されます。
使用方法
CAST関数を使用してデータ型を変換する場合、以下のケースがサポートされています:
2つの式のデータ型が完全に同一である場合
2つの式が暗黙的に変換可能な場合
データ型を明示的に変換する必要がある場合
式exprの値がターゲットデータ型の値の範囲を超える場合、型変換は
null返します。高精度データ型を低精度データ型に変換すると、精度が失われます。
固定小数点数(
DECIMAL(m,d))、浮動小数点数(DOUBLE、FLOAT)を整数(INT/INTEGER、SMALLINTまたはTINYINT)に変換すると、精度が失われます。式exprが
VARCHAR型であり、数値ではない場合、INT/INTEGER、SMALLINTまたはTINYINT型に変換すると、結果は0返します。式exprがJSON型であり、数値ではない場合、
INT/INTEGER、SMALLINTまたはTINYINT型に変換すると、エラーが返されます。VARCHARデータまたはJSONデータがARRAY形式に適合しない場合、変換時にエラーが報告されます。
ユーザーが不可能な変換を試みた場合、OceanBaseデータベースはエラーメッセージを表示します。変換時にデータ型の長さを指定しない場合、OceanBaseデータベースシステム内部の最大長が使用されます。例えば、VARCHARは262,143バイト、NUMBERは65ビットの浮動小数点精度です。
CAST()は、符号付きおよび符号なしの64ビット値の演算をサポートしています。数値演算子(例えば+)を使用していて、そのうちの1つの演算子が符号なし整数の場合、結果は符号なしになります。SIGNEDとUNSIGNEDを使用して結果を明示的に宣言し、演算をそれぞれ符号付きまたは符号なしの64ビット整数として指定できます。いずれかの演算子が浮動小数点数の場合、結果は浮動小数点数になります。
例
数値0を
DATE型に変換します。obclient> SELECT CAST(0 AS DATE); +-----------------+ | CAST(0 AS DATE) | +-----------------+ | 0000-00-00 | +-----------------+ 1 row in set数値123を
TIME型に変換します。obclient> SELECT CAST(123 AS TIME); +-------------------+ | CAST(123 AS TIME) | +-------------------+ | 00:01:23 | +-------------------+ 1 row in set数値123を
DATETIME型に変換します。obclient> SELECT CAST(123 AS DATETIME(4)); +--------------------------+ | CAST(123 AS DATETIME(4)) | +--------------------------+ | 2000-01-23 00:00:00.0000 | +--------------------------+ 1 row in set数値123を
DECIMAL型に変換します。obclient> SELECT CAST(123 AS DECIMAL(3,2)); +---------------------------+ | CAST(123 AS DECIMAL(3,2)) | +---------------------------+ | 9.99 | +---------------------------+ 1 row in set文字列テキスト「123」をJSON型に変換します。
obclient> SELECT CAST("123" AS JSON); +---------------------+ | CAST("123" AS JSON) | +---------------------+ | 123 | +---------------------+ 1 row in set「1-2」の結果をそれぞれ符号なし表現と符号あり表現で使用します。
obclient> SELECT CAST(1-2 AS UNSIGNED), CAST(cast(1-2 AS UNSIGNED) AS SIGNED); +-----------------------+---------------------------------------+ | CAST(1-2 AS UNSIGNED) | CAST(cast(1-2 AS UNSIGNED) AS SIGNED) | +-----------------------+---------------------------------------+ | 18446744073709551615 | -1 | +-----------------------+---------------------------------------+ 1 row in setCAST()を使用して数値演算を実行します。obclient> SELECT CAST(1 AS UNSIGNED) - 2.0; +---------------------------+ | CAST(1 AS UNSIGNED) - 2.0 | +---------------------------+ | -1.0 | +---------------------------+ 1 row in set数値123を
CHAR型に変換します。obclient> SELECT CAST(123 AS CHAR(2)); +----------------------+ | CAST(123 AS CHAR(2)) | +----------------------+ | 12 | +----------------------+ 1 row in set数値1を
CHAR型に変換し、文字セットを指定します。obclient> SELECT CAST(1 AS CHAR CHARACTER SET utf8mb4); +---------------------------------------+ | CAST(1 AS CHAR CHARACTER SET utf8mb4) | +---------------------------------------+ | 1 | +---------------------------------------+ 1 row in set文字列
123を整数型に、整数1をINT型に変換します。obclient> SELECT CAST('123' AS INT),CAST(1 AS CHAR(10)); +--------------------+---------------------+ | CAST('123' AS INT) | CAST(1 AS INT) | +--------------------+---------------------+ | 123 | 1 | +--------------------+---------------------+ 1 row in set (0.035 secJSON型のデータ[1,2,3]をARRAYデータに変換します。ここで、ARRAYデータはINT型で構成されています。ステートメントは以下のとおりです:
obclient> SELECT CAST( JSON '[1,2,3]' AS ARRAY<int>);
+-------------------------------------+
| CAST( JSON '[1,2,3]' AS ARRAY<int> |
+-------------------------------------+
| [1,2,3] |
+-------------------------------------+
1 row in set (0.035 sec