Casting Datatypes

You can cast one data type to another using the cast expression.

In JSON, casting is particularly useful for timestamp information because JSON has no equivalent to the Oracle NoSQL Database Timestamp data type. Instead, the timestamp information is carried in a JSON object as a string. To work with it as a Timestamp, use cast.

In Working with Timestamps we showed how to work with the timestamp data type. In this case, what you do is no different except you must cast both sides of the expression. Also, because the left side of the expression is a sequence, you must specify a type quantifier (* in this case):


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 

As another example, you can cast to an integer and then operate on that number:

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 |
 +----+---------------------+----------+ 

If you want to operate on just the row that contains the number as a string, use 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 |
 +----+---------------------+----------+