CAST式

構文

cast_expression ::= CAST "(" expression AS sequence_type ")"

セマンティクス

CAST式は、可能な場合、特定のターゲット・タイプの新しい項目をその入力順序の項目から作成します。具体的には、CAST式は次のように評価されます。

カーディナリティ・チェックが最初に実行されます。
  1. ターゲット・タイプの数量詞が*の場合、順序に任意の数の項目を含めることができます
  2. 数量詞が+の場合、入力順序には少なくとも1つの項目が必要です
  3. 数量詞が?の場合、入力順序には最大で1つの項目が必要です
  4. 数量詞がない場合、入力順序には1つの項目のみが必要です。
入力順序のカーディナリティがターゲット・タイプの数量詞と一致しない場合、エラーが発生します。その後、各入力項目は、次の(再帰的)ルールに従ってターゲット項目タイプにキャストされます。
  • 入力項目のタイプがターゲット項目タイプと等しい場合、キャストはno-opであり、入力項目自体が返されます。
  • ターゲット・タイプがJSON以外のワイルドカード・タイプで、入力項目のタイプがワイルドカード・タイプのサブタイプである場合、キャストはno-opです。そうでない場合はエラーが発生します。
  • ターゲット・タイプがJSONの場合、(a)入力項目が非jsonアトミック型の場合はエラーが発生します。そうでない場合、(b)入力項目のタイプがjsonアトミック型か、ARRAY(JSON)またはMAP(JSON)の場合、キャストはno-opです。そうでない場合、(c)入力項目が非json配列の場合、タイプARRAY(JSON)の新しい配列が作成され、入力配列の各要素がJSONにキャストされ、結果の項目が新しいjson配列に追加されます。そうでない場合、(d)入力項目が非jsonマップの場合、タイプMAP(JSON)の新しいマップが作成され、入力マップの各フィールド値がJSONにキャストされ、結果の項目が関連するフィールド名とともに新しいjsonマップに挿入されます。そうでない場合、(e)入力項目がレコードの場合、次に説明するように、タイプMAP(JSON)のマップにキャストされます。
  • ターゲット・タイプが配列タイプの場合、入力項目が配列でないとエラーが発生します。それ以外の場合、タイプがターゲット・タイプである新しい配列が作成され、入力配列の各要素がターゲット配列の要素タイプにキャストされ、結果の項目が新しい配列に追加されます。
  • ターゲット・タイプがマップ・タイプの場合、入力項目がマップまたはレコードでないとエラーが発生します。それ以外の場合は、タイプがターゲット・タイプである新しいマップが作成され、入力マップ/レコードの各フィールド値がターゲット・マップの値タイプにキャストされ、結果のフィールド値が関連するフィールド名とともに新しいマップに挿入されます。
  • ターゲット・タイプがレコード・タイプの場合、入力項目がレコードまたはマップでないとエラーが発生します。それ以外の場合は、タイプがターゲット・タイプである新しいレコードが作成されます。入力項目がレコードの場合、そのタイプには、ターゲット・タイプと同じフィールドが同じ順序で含まれている必要があります。この場合、入力レコードの各フィールド値はターゲット・タイプの対応するフィールドの値タイプにキャストされ、結果のフィールド値が関連するフィールド名とともに新しいレコードに追加されます。入力項目がマップの場合、各マップ・フィールドについて、ターゲット・タイプにフィールド名が存在する場合は、関連するフィールド値がターゲット・タイプの対応するフィールドの値タイプにキャストされ、結果のフィールド値が関連するフィールド名とともに新しいレコードに追加されます。名前が入力マップに表示されない新しいレコードのフィールドは、関連するフィールド値がデフォルト値に設定されます。
  • ターゲット・タイプが文字列の場合、入力項目は任意のタイプにすることができます。つまり、すべての項目を文字列にキャストできます。複雑な項目の場合、文字列値は値のjsonテキスト表現です。タイムスタンプの場合、文字列値はUTCであり、uuuu-MM-dd['T'HH:mm:ss]という形式です。バイナリ項目の場合、文字列値は、バイトのbase64エンコーディングです。
  • ターゲット・タイプが文字列以外のアトミック型である場合、入力項目もアトミックである必要があります。アトミック項目およびタイプ間で、次のキャストが許可されています。
    • すべての数値項目を他のすべての数値タイプにキャストできます。キャストはJavaのように行われます。
    • integerとlongは、タイムスタンプにキャストできます。入力値は、1970年1月1日、00:00:00 GMTからのミリ秒数として解釈されます。
    • 文字列項目は、他のすべてのアトミック型にキャスト可能です。キャストが成功するかどうかは、ターゲット・タイプのドメインに属する値に実際の文字列値を解析できるかどうかによって決まります。
    • タイムスタンプ項目は、すべてのタイムスタンプ・タイプにキャストできます。ターゲット・タイプの精度が入力項目よりも小さい場合、結果のタイムスタンプは、ターゲット精度の入力タイムスタンプに最も近いものになります。たとえば、精度が3の2つのタイムスタンプ2016-11-01T10:00:00.236および2016-11-01T10:00:00.267を考えてみます。これらのタイムスタンプを精度1にキャストした結果は、それぞれ2016-11-01T10:00:00.2および2016-11-01T10:00:00.3になります。

例6-48 CAST式

2015年以降に現在の住所に移動したユーザーの姓を選択します。

SELECT u.lastName FROM Users u
WHERE 
CAST (u.address.startDate AS Timestamp(0)) >=
CAST ("2015-01-01T00:00:00" AS Timestamp(0));

タイムスタンプ値にはリテラルがないため、そのような値を作成するには、タイムスタンプ・タイプに文字列をキャストする必要があります。