El tipo de datos no coincide en las fechas al analizar un json, dentro de una declaración INSERT
A continuación se muestra un pequeño código para analizar una matriz json en una tabla en una base de datos:
CREATE TEMPORARY TABLE json_import (doc json) ON COMMIT DROP;
INSERT INTO json_import (doc) VALUES(
'[
{
"cli_nk": 1,
"effective_from_date": "2021-01-18",
"effective_to_date": "",
"user_dml_type_code": "U",
"user_fix_desc": "qwert"
},
{
"cli_nk": 2,
"effective_from_date": "2023-03-25",
"effective_to_date": "",
"user_dml_type_code": "I",
"user_fix_desc": "qwe"
},
{
"cli_nk": 4,
"effective_from_date": "2015-07-18",
"effective_to_date": "2999-12-31",
"user_dml_type_code": "D",
"user_fix_desc": "ytrewq"
},
{
"cli_nk": 5,
"effective_from_date": "2016-08-03",
"effective_to_date": "2999-12-31",
"user_dml_type_code": "U",
"user_fix_desc": "zxc"
}
]'
);
INSERT INTO user_type (cli_nk, effective_from_date, effective_to_date, user_dml_type_code, user_fix_desc)
SELECT
NULLIF (p.cli_nk, ''),
NULLIF (p.effective_from_date, ''),
NULLIF (p.effective_to_date, ''),
NULLIF (p.user_dml_type_code, ''),
NULLIF (p.user_fix_desc, '')
FROM json_import l
CROSS JOIN LATERAL json_populate_recordset(NULL::user_type, doc) AS p;
DDL de mi tabla user_type:
CREATE TABLE public.user_type (
cli_nk text NULL,
effective_from_date date NULL,
effective_to_date date NULL,
user_dml_type_code bpchar(1) NOT NULL,
user_fix_desc text NULL
);
Pero después de intentar ejecutarlo, aparece el siguiente error:
Error de SQL [22007]: ERROR: sintaxis no válida para el tipo de fecha: "" Posición: 180
¿Cómo puedo manejar este error y llenar la tabla correctamente?
Su problema está relacionado con el hecho de que algunas de las fechas contenidas en su json no están especificadas (son iguales a la cadena vacía). Cuando Postgres intenta convertir la cadena vacía al tipo de datos DATE durante la instrucción INSERT, no sabe qué hacer con ella, porque la cadena vacía no es un valor nulo.
Una forma de solucionar este problema es definir un tipo de datos temporal, que pueda adquirir cadenas vacías como cadenas y luego convertir los tipos de datos sin procesar en los tipos de datos de la tabla.
CREATE TYPE raw_data AS (
cli_nk INTEGER,
effective_from_date TEXT,
effective_to_date TEXT,
user_dml_type_code TEXT,
user_fix_desc TEXT
);
INSERT INTO user_type
SELECT cli_nk,
CAST(CASE WHEN NOT effective_from_date = '' THEN effective_from_date END AS DATE),
CAST(CASE WHEN NOT effective_to_date = '' THEN effective_to_date END AS DATE),
user_dml_type_code,
user_fix_desc
FROM json_import l
CROSS JOIN LATERAL JSON_POPULATE_RECORDSET(NULL::raw_data, l.doc) AS p;
Producción :
tintinar | fecha_efectiva_desde_fecha | efectivo_hasta_la fecha | código_tipo_dml_usuario | usuario_fix_desc |
---|---|---|---|---|
1 | 2021-01-18T00:00:00.000Z | nulo | Ud. | qwert |
2 | 2023-03-25T00:00:00.000Z | nulo | I | qwe |
4 | 2015-07-18T00:00:00.000Z | 2999-12-31T00:00:00.000Z | D | ytrewq |
5 | 2016-08-03T00:00:00.000Z | 2999-12-31T00:00:00.000Z | Ud. | zxc |
Consulte la demostración aquí .