Operaciones JSON temporales

En esta sección, damos las versiones temporales de las funciones para los tipos json y jsonb. Remitimos a la documentación de PostgreSQL para explicaciones detalladas de estas funciones. Hemos buscado mantener en la medida de lo posible la misma sintaxis para las versiones no temporales y temporales de estas funciones, como se ilustra en este documento.

Como se indicó en “Temporalización de operaciones”, una forma común de generalizar las operaciones tradicionales a los tipos temporales es aplicar la operación en cada instante, lo que produce un valor temporal como resultado. Considere por ejemplo el operador -> que extrae un campo de objeto JSON con la clave dada.

SELECT jsonb '{"unit": "km", "speed": 10}' -> text 'speed';
-- 10

Aplicar el mismo operador a un valor JSON o JSONB temporal produce el siguiente resultado

SELECT ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
  {"unit": "km", "speed": 20}@2001-01-02]}' -> text 'speed';
-- {["10"@2001-01-01, "20"@2001-01-02]}
SELECT tjsonb '{[{"unit": "km", "speed": 10}@2001-01-01,
  {"unit": "km", "speed": 20}@2001-01-02]}' -> text 'speed';
-- {["10"@2001-01-01, "20"@2001-01-02]}

que se obtiene aplicando el operador de PostgreSQL -> en cada instante del valor JSON o JSONB temporal.

Al manipular colecciones JSON de estructura variable, puede ocurrir que un elemento esté definido en algunos de los documentos pero no en todos. PostgreSQL proporciona el modo lax para este propósito, donde el argumento null_value_treatment determina el comportamiento en el caso en que una función devuelve un valor NULL. El argumento puede tomar uno de los siguientes valores: 'raise_exception', 'use_json_null', 'delete_key', 'return_target', donde 'use_json_null' es el valor por defecto. En PostgreSQL el modo lax se admite solo para operaciones de actualización (no de consulta) con la función jsonb_set_lax. En MobilityDB, hemos mantenido la misma semántica para la función correspondiente tjsonb_set_lax, pero habilitamos un comportamiento similar para todas las operaciones JSON temporales que pueden devolver un valor nulo, salvo que reemplazamos el valor 'return_target' por 'return_null', ya que el primero no tiene sentido para operaciones temporales. Para operadores como ->, se utiliza el valor por defecto 'use_json_null' y no se puede cambiar, mientras que para las funciones correspondientes tjson_object_field y tjsonb_object_field, el último argumento especifica el comportamiento en el caso en que la función devuelve NULL. Ilustramos este comportamiento para la función tjson_object_field a continuación.