CAST 関数とは異なり、TRY_CAST は最初に式を指定された型にキャストしようとします。変換エラーによりキャストが失敗した場合、オペレーションは null を返します。変換が明示的に許可されていない場合、オペレーションはエラーを返します。許可されている変換のリストは、以下の使用に関する注意事項に記載されています。例えば、ブール値のタイムスタンプへの変換は許可されていません。
構文
TRY_CAST(expression AS type)
引数
- expression
-
1 つ以上の値 (列名、値など) に評価される式。null 値を変換すると、null が返されます。式に、空白または空の文字列を含めることはできません。
- type
-
サポートされているデータ型。データ型の完全なリストについては、「データ型」を参照してください。サポートされているソースデータ型とターゲットデータ型のペアのリストについては、以下の使用に関する注意事項を参照してください。
戻り型
TRY_CAST は、type 引数で指定されたデータ型の値を返します。変換が失敗した場合、オペレーションは null を返します。
使用に関する注意事項
以下は、Amazon Redshift が TRY_CAST でサポートするソースデータ型とターゲットデータ型のペアのリストです。
- BOOL
-
SMALLINT、INT、BIGINT、SUPER
- SMALLINT
-
BOOL、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER
- INT
-
BOOL、SMALLINT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER
- BIGINT
-
BOOL、SMALLINT、INT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER
- DECIMAL
-
SMALLINT、INT、BIGINT、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER
- REAL
-
SMALLINT、INT、BIGINT、DECIMAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER
- FLOAT
-
SMALLINT、INT、BIGINT、DECIMAL、REAL、BPCHAR、TEXT、VARCHAR、SUPER
- BPCHAR
-
SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER
- TEXT
-
SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER
- VARCHAR
-
SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER
- TIMESTAMP
-
BPCHAR、TEXT、VARCHAR、TIMESTAMPTZ、DATE、TIME
- TIMESTAMPTZ
-
BPCHAR、TEXT、VARCHAR、TIMESTAMP、DATE、TIME、TIMETZ
- DATE
-
BPCHAR、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ
- TIME
-
BPCHAR、TEXT、VARCHAR
- TIMETZ
-
BPCHAR、TEXT、VARCHAR
- SUPER
-
SUPER は、DATE、TIME、TIMETZ、TIMESTAMP、TIMESTAMPTZ を除き、他の任意のデータ型に変換できます。
例
次の例では、STRING を INTEGER にキャストします。
SELECT TRY_CAST('123' AS INT);
int ---- 123
次の例は、null を返します。STRING を INTEGER に変換することは許可されているため、TRY_CAST はエラーを返しませんが、'foo' は整数ではないため、関数は null を返します。
SELECT TRY_CAST('foo' AS INT)
次の例では、BOOLEAN を TIMESTAMP に変換することは許可されていないため、エラーを返します。
SELECT TRY_CAST(true as timestamp);
TRY_CAST は変換が失敗した場合にエラーをすぐに返す代わりに null を返すため、TRY_CAST を使用して無効なデータをフィルタリングできます。次の例では、Akua Mansa の age 列で変換が失敗したために無効な行が除外されます。
CREATE TABLE IF NOT EXISTS student_data(
name VARCHAR(100) NOT NULL,
age VARCHAR(3) NOT NULL,
enrollment_date DATE NOT NULL);
INSERT INTO student_data (name, age, enrollment_date)
VALUES
('Alejandro Rosalez', '10', '01/01/2000'),
('Akua Mansa', 'Ten', '01/01/2000');
SELECT * FROM student_data WHERE TRY_CAST(age AS INT) IS NOT NULL;
--Akua is not returned.
name | age | enrollment_date
-------------------+-----+-----------------
Alejandro Rosalez | 10 | 01/01/2000