Search code examples
sqloracle-databaseoracle12c

CAST TO DATE into JSON_TABLE DEFINITION - Oracle


I have the next code:

INSERT INTO TMP_VDD_JSON
VALUES (
    200, 2, 4010,
    '{
        "Cuenta": [
            {
                "persona": {"nombre": "Pedro", "documento": "9876543A", "fecha-nacimiento": "02/02/1982", "ciudad": "Barcelona"}
            }
        ]
);

I want to convert it into JSON_TABLE.

SELECT jt.NOMBRE, jt.DOCUMENTO, jt.FECHA_NACIMIENTO, jt.CIUDAD
FROM TMP_VDD_JSON tmp,
JSON_TABLE(tmp.JSON_OBJ, '$.Cuenta[0].persona'
    COLUMNS (
        NOMBRE PATH '$.nombre',
        DOCUMENTO PATH '$.documento',
        **FECHA_NACIMIENTO DATE PATH '$."fecha-nacimiento",**
        CIUDAD PATH '$.ciudad'
    )) jt

The main purpose is to cast the field FECHA_NACIMIENTO implicit to DATE, INTO clause of JSON_TABLE.

¡I NO WANT TO DO IT INTO SELECT STATEMENT! There are any way?


Solution

  • There are any way?

    Yes, if your date is in ISO 8601 format:

    CREATE TABLE tmp_vdd_json(
      JSON_OBJ CLOB CHECK ( json_obj IS JSON )
    );
    
    INSERT INTO TMP_VDD_JSON
    VALUES (
    '{"Cuenta": [{"persona": {
        "nombre": "Pedro",
        "documento": "9876543A",
        "fecha-nacimiento": "1982-02-02",
        "ciudad": "Barcelona"
    }}]}'
    );
    

    Then your query (if you add the missing closing single-quote) works:

    SELECT jt.NOMBRE, jt.DOCUMENTO, jt.FECHA_NACIMIENTO, jt.CIUDAD
    FROM TMP_VDD_JSON tmp,
    JSON_TABLE(tmp.JSON_OBJ, '$.Cuenta[0].persona'
        COLUMNS (
            NOMBRE PATH '$.nombre',
            DOCUMENTO PATH '$.documento',
            FECHA_NACIMIENTO DATE PATH '$."fecha-nacimiento"',
            CIUDAD PATH '$.ciudad'
        )) jt
    

    And outputs:

    NOMBRE DOCUMENTO FECHA_NACIMIENTO CIUDAD
    Pedro 9876543A 02-FEB-82 Barcelona

    If you have a non-standard date format then, no, it will not work and you need to perform the conversion in the select list like this (adjust the format model for your data):

    SELECT jt.NOMBRE,
           jt.DOCUMENTO,
           TO_DATE( jt.FECHA_NACIMIENTO, 'YYYY-MM-DD' ) AS FECHA_NACIMIENTO,
           jt.CIUDAD
    FROM   TMP_VDD_JSON tmp
           CROSS APPLY JSON_TABLE(
             tmp.JSON_OBJ,
             '$.Cuenta[0].persona'
             COLUMNS (
               NOMBRE           VARCHAR2(20) PATH '$.nombre',
               DOCUMENTO        VARCHAR2(20) PATH '$.documento',
               FECHA_NACIMIENTO VARCHAR2(20) PATH '$."fecha-nacimiento"',
               CIUDAD           VARCHAR2(20) PATH '$.ciudad'
             )
           ) jt
    

    db<>fiddle here