

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# CAST 関数
<a name="r_CAST_function"></a>

CAST 関数は、1 つのデータ型を互換性のある別のデータ型に変換します。例えば、文字列を日付に変換したり、数値型を文字列に変換したりできます。CAST はランタイム変換を実行します。つまり、変換によってソーステーブル内の値のデータ型は変更されません。クエリのコンテキストでのみ変更されます。

CAST 関数は、あるデータ型から別のデータ型に変換するという点では [CONVERT 関数](r_CONVERT_function.md) とよく似ていますが、呼び出し方が異なります。

特定のデータ型は、CAST 関数または CONVERT 関数を使用して、他のデータ型に明示的に変換する必要があります。その他のデータ型は、CAST や CONVERT を使用せずに、別のコマンドの一部として暗黙的に変換できます。「[型の互換性と変換](c_Supported_data_types.md#r_Type_conversion)」を参照してください。

## 構文
<a name="r_CAST_function-syntax"></a>

式のデータ型を別のデータ型に変換するには、次の 2 つの同等な構文フォームのいずれかを使用します。

```
CAST ( expression AS type )
expression :: type
```

## 引数
<a name="r_CAST_function-arguments"></a>

 *expression*   
1 つ以上の値 (列名、値など) に評価される式。null 値を変換すると、null が返されます。式に、空白または空の文字列を含めることはできません。

 *型*   
サポートされる [データ型](c_Supported_data_types.md) の 1 つ。

## 戻り型
<a name="r_CAST_function-return-type"></a>

CAST は、*type* 引数で指定されたデータ型を返します。

**注記**  
次の正確性が失われる DECIMAL 変換のように、問題のある変換を実行しようとすると、Amazon Redshift はエラーを返します。  

```
select 123.456::decimal(2,1);
```
また、次の INTEGER 変換では、オーバーフローが生じます。  

```
select 12345678::smallint;
```

## 例
<a name="r_CAST_function-examples"></a>

一部の例では、サンプルの [TICKIT データベース](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)を使用しています。サンプルデータの設定の詳細については、「[データをロードする](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html)」を参照してください。

次の 2 つのクエリは同等です。どちらも 10 進値を整数に変換します。

```
select cast(pricepaid as integer)
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

```
select pricepaid::integer
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

次の場合も同様の結果が得られます。サンプルデータの実行は必要ありません。

```
select cast(162.00 as integer) as pricepaid;

pricepaid
-----------
162
(1 row)
```

次の例では、タイムスタンプ列の値を日付に変換して、各結果から時刻を削除します。

```
select cast(saletime as date), salesid
from sales order by salesid limit 10;

 saletime  | salesid
-----------+---------
2008-02-18 |       1
2008-06-06 |       2
2008-06-06 |       3
2008-06-09 |       4
2008-08-31 |       5
2008-07-16 |       6
2008-06-26 |       7
2008-07-10 |       8
2008-07-22 |       9
2008-08-06 |      10
(10 rows)
```

前のサンプルで示した CAST を使用しなかった場合、結果には *2008-02-18 02:36:48* という時刻が含まれます。

次のクエリは、可変文字データを日付に変換します。実行にサンプルデータは必要ありません。

```
select cast('2008-02-18 02:36:48' as date) as mysaletime;

mysaletime    
--------------------
2008-02-18  
(1 row)
```

次の例では、日付列の値をタイムスタンプに変換します。

```
select cast(caldate as timestamp), dateid
from date order by dateid limit 10;

      caldate       | dateid
--------------------+--------
2008-01-01 00:00:00 |   1827
2008-01-02 00:00:00 |   1828
2008-01-03 00:00:00 |   1829
2008-01-04 00:00:00 |   1830
2008-01-05 00:00:00 |   1831
2008-01-06 00:00:00 |   1832
2008-01-07 00:00:00 |   1833
2008-01-08 00:00:00 |   1834
2008-01-09 00:00:00 |   1835
2008-01-10 00:00:00 |   1836
(10 rows)
```

前のサンプルのような場合は、[TO\$1CHAR](https://docs.aws.amazon.com/redshift/latest/dg/r_TO_CHAR.html) を使用して出力フォーマットをさらに制御できます。

次の例では、整数を文字列に変換します。

```
select cast(2008 as char(4));

bpchar
--------
2008
```

次の例では、DECIMAL(6,3) 値を DECIMAL(4,1) 値に変換します。

```
select cast(109.652 as decimal(4,1));

numeric
---------
109.7
```

この例は、より複雑な式を示しています。SALES テーブル内の PRICEPAID 列 (DECIMAL(8,2) 列) を DECIMAL(38,2) 列に変換し、結果の値を 100000000000000000000 で乗算します。

```
select salesid, pricepaid::decimal(38,2)*100000000000000000000
as value from sales where salesid<10 order by salesid;


 salesid |           value
---------+----------------------------
       1 | 72800000000000000000000.00
       2 |  7600000000000000000000.00
       3 | 35000000000000000000000.00
       4 | 17500000000000000000000.00
       5 | 15400000000000000000000.00
       6 | 39400000000000000000000.00
       7 | 78800000000000000000000.00
       8 | 19700000000000000000000.00
       9 | 59100000000000000000000.00
(9 rows)
```

**注記**  
`GEOMETRY` データ型に対して CAST や CONVERT オペレーションを実行して別のデータ型に変更することはできません。ただし、`GEOMETRY` 引数を受け入れる関数への入力として、Extended Well-Known Binary (EWKB) 形式の 16 進数の文字列リテラルを指定できます。例えば、後続の `ST_AsText` 関数は `GEOMETRY` データ型を想定します。  

```
SELECT ST_AsText('01010000000000000000001C400000000000002040');
```

```
st_astext  
------------
 POINT(7 8)
```
また、明示的に `GEOMETRY` データ型を指定することもできます。  

```
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
```

```
st_astext  
------------
 POINT(5 6)
```