データ型のキャスト
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 |
+----+---------------------+----------+