データ型のキャスト

cast式を使用して、1つのデータ型を別のデータ型にキャストできます。

JSONにはOracle NoSQL Databaseのタイムスタンプ・データ型と同等のデータ型がないため、JSONのタイムスタンプ情報には特にキャストが役立ちます。かわりに、タイムスタンプ情報はJSONオブジェクトに文字列として格納されます。これをタイムスタンプとして使用するために、castを使用します。

タイムスタンプの操作で、タイムスタンプ・データ型の使用方法について説明しました。今回も、式の両側をキャストする必要があることを除き、同じことを行います。また、式の左側はシーケンスであるため、型数量詞(この場合は*)を指定する必要があります。


sql-> SELECT id, 
             j.person.firstname, j.person.lastname, j.person.lastLogin 
             FROM JSONPersons j 
             WHERE CAST(j.person.lastLogin AS TIMESTAMP*) > 
             CAST("2016-11-01" AS TIMESTAMP) AND 
             CAST(j.person.lastLogin AS TIMESTAMP*) < 
             CAST("2016-11-30" AS TIMESTAMP);
 +----+------------+--------------+----------------------------+
 | id | firstname  |   lastname   |       lastLogin            |
 +----+------------+--------------+----------------------------+
 |  3 | John       | Morgan       | 2016-11-29T08:21:35.4971   |
 +----+------------+--------------+----------------------------+
 |  2 | John       | Anderson     | 2016-11-28T13:01:11.2088   |
 +----+------------+--------------+----------------------------+
 |  5 | Dana       | Scully       | 2016-11-08T09:16:46.3929   |
 +----+------------+--------------+----------------------------+

3 rows returned 

別の例として、整数にキャストして、その数値を操作することもできます。

sql-> SELECT id, j.person.mynumber, 
             CAST(j.person.mynumber as integer) * 10 AS TenTimes 
             FROM JSONPersons j WHERE EXISTS j.person.mynumber;
 +----+---------------------+----------+
 | id |      mynumber       | TenTimes |
 +----+---------------------+----------+
 |  7 | 5                   |       50 |
 +----+---------------------+----------+
 |  6 | 5                   |       50 |
 +----+---------------------+----------+ 

文字列として数値を含む行のみを操作する場合は、IS OF TYPEを使用します。

sql-> SELECT id, j.person.mynumber, 
             CAST(j.person.mynumber as integer) * 10 AS TenTimes 
             FROM JSONPersons j WHERE EXISTS j.person.mynumber
             AND j.person.mynumber IS OF TYPE (string);
 +----+---------------------+----------+
 | id |      mynumber       | TenTimes |
 +----+---------------------+----------+
 |  7 | 5                   |       50 |
 +----+---------------------+----------+