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 tjsonbSetLax, 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 tjsonObjectField y tjsonbObjectField, el último argumento especifica el comportamiento en el caso en que la función devuelve NULL. Ilustramos este comportamiento para la función tjsonObjectField a continuación.
Extraer un campo de objeto JSON temporal especificado por una clave
{ttext,tjsonb} -> text → {ttext,tjsonb}
tjsonb ->> text → ttext
tjsonObjectField(ttext,text,null_handle text='use_json_null') → ttext
tjsonbObjectField(tjsonb,text,null_handle text='use_json_null') → tjsonb
tjsonbObjectFieldText(tjsonb,text,null_handle text='use_json_null') → ttext
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 '[{"position":"Point(1 1)", "speed":10}@2001-01-01,
{"position":"Point(2 2)", "speed":20}@2001-01-03]' ->> text 'position';
-- ["Point(1 1)"@2001-01-01, "Point(2 2)"@2001-01-03]
SELECT ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km"}@2001-01-02, {"unit": "km", "speed": 10}@2001-01-03]}' -> text 'speed';
-- {[10@2001-01-01, null@2001-01-02, 10@2001-01-03]}
Mostramos a continuación el comportamiento de la función tjsonObjectField para los posibles valores del argumento null_handle. Todas las funciones JSON que pueden devolver un valor NULL se comportan de forma similar en MobilityDB.
SELECT tjsonObjectField(ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km"}@2001-01-02, {"unit": "km", "speed": 10}@2001-01-03]}', 'speed',
'raise_exception');
-- ERROR: The lifted operation returned NULL
SELECT tjsonObjectField(ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km"}@2001-01-02, {"unit": "km", "speed": 10}@2001-01-03]}', 'speed',
'use_json_null');
-- {[10@2001-01-01, null@2001-01-02, 10@2001-01-03]}
SELECT tjsonObjectField(ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km"}@2001-01-02, {"unit": "km", "speed": 10}@2001-01-03]}', 'speed',
'delete_key');
-- {[10@2001-01-01, 10@2001-01-02), [10@2001-01-03]}
SELECT tjsonObjectField(ttext '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km"}@2001-01-02, {"unit": "km", "speed": 10}@2001-01-03]}', 'speed',
'return_null');
-- NULL
Extraer un campo de objeto JSON temporal especificado por una ruta
{ttext,tjsonb} #> text[] → {ttext,tjsonb}
tjsonExtractPath(ttext,text[],null_handle text='use_json_null') → ttext
tjsonbExtractPath(tjsonb,text[],null_handle text='use_json_null') → tjsonb
tjsonbExtractPathText(tjsonb,text[],null_handle text='use_json_null') → ttext
SELECT ttext '[{"speed": {"unit": "km", "value": 10}}@2001-01-01,
{"speed": {"unit": "km", "value": 20}}@2001-01-02]' #> ARRAY[text 'speed', 'value'];
-- {["10"@2001-01-01, "20"@2001-01-02]}
SELECT tjsonb '[{"position":"Point(1 1)", "PoIs":["Grand Place", "La Bourse"]}@2001-01-01,
{"position":"Point(2 2)", "PoIs":["Palais Royal", "Manneken Pis"]}@2001-01-03]' #>>
ARRAY[text 'PoIs', '1'];
-- ["La Bourse"@2001-01-01, "Manneken Pis"@2001-01-03]
Extraer un elemento de un arreglo JSON temporal
tjsonArrayElement(tjsonb,integer,null_handle text='use_json_null') → tjsonb tjsonbArrayElement(tjsonb,integer,null_handle text='use_json_null') → tjsonb tjsonbArrayElementText(tjsonb,integer,null_handle text='use_json_null') → tjsonb
SELECT tjsonArrayElement(ttext '[["Grand Place", "La Bourse"]@2001-01-01, ["Palais Royal", "Manneken Pis"]@2001-01-02]', 0); -- ["Grand Place"@2001-01-01, "Palais Royal"@2001-01-02] SELECT tjsonbArrayElement(tjsonb '[["Grand Place", "La Bourse"]@2001-01-01, ["Palais Royal", "Manneken Pis"]@2001-01-02]', 1); -- ["La Bourse"@2001-01-01, "Manneken Pis"@2001-01-02]
Extraer un valor alfanumérico temporal de un valor JSONB temporal dado por una clave
tbool(tjsonb,text,null_handle text='raise_exception') → tbool tint(tjsonb,text,null_handle text='raise_exception') → tint tfloat(tjsonb,text,interp='linear',null_handle text='raise_exception') → tfloat ttext(tjsonb,text, null_handle text='raise_exception') → ttext
Tenga en cuenta que el valor use_json_null no puede utilizarse para las funciones anteriores y por lo tanto se utiliza el valor por defecto 'raise_exception'.
SELECT tbool(tjsonb '[{"speed": 10, "lights": "on"}@2001-01-01,
{"speed": 20, "lights": "on"}@2001-01-02]', 'lights');
-- [true@2001-01-01, true@2001-01-02]
SELECT tint(tjsonb '[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20, "units": "km/h"}@2001-01-02]', 'speed');
-- [10@2001-01-01, 20@2001-01-02]
SELECT tfloat(tjsonb '{[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20, "units": "km/h"}@2001-01-02],[{"speed": 20}@2001-01-03,
{"speed": 20}@2001-01-04]}', 'speed', 'step');
-- Interp=Step;{[10@2001-01-01, 20@2001-01-02], [20@2001-01-03, 20@2001-01-04]}
SELECT ttext(tjsonb '[{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-01,
{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-02,
{"road": "Bvd de la Cambre", "category": "residential"}@2001-01-03]', 'category');
-- [primary@2001-01-01, residential@2001-01-03]
Concatenación JSONB temporal
tjsonb || {jsonb,tjsonb} → tjsonb
SELECT tjsonb '{[{"speed":10}@2001-01-01, {"speed":20}@2001-01-02]}' ||
'{"unit":"km"}'::jsonb;
-- {[{"unit": "km", "speed": 10}@2001-01-01, {"unit": "km", "speed": 20}@2001-01-02]}
SELECT tjsonb '{[{"speed":10}@2001-01-01, {"speed":20}@2001-01-03]}' ||
tjsonb '{[{"Position":"Point(1 1)"}@2001-01-02, {"Position":"Point(2 2)"}@2001-01-04]}';
/* {[{"speed": 10, "Position": "Point(1 1)"}@2001-01-02,
{"speed": 20, "Position": "Point(2 2)"}@2001-01-03]} */
Eliminación JSONB temporal
tjsonb - {int,text,text[]} → tjsonb
tjsonb #- text[] → tjsonb
SELECT tjsonb '{[{"unit": "km", "speed": 10}@2001-01-01,
{"unit": "km", "speed": 20}@2001-01-02]}' - 'unit';
-- {[{"speed": 10}@2001-01-01, {"speed": 20}@2001-01-02]}
SELECT tjsonb '[["Grand Place", "La Bourse"]@2001-01-01,
["Palais Royal", "Manneken Pis"]@2001-01-02]' - 1;
-- [["Grand Place"]@2001-01-01, ["Palais Royal"]@2001-01-02]
SELECT tjsonb '[{"location":"Point(1 1)", "PoIs": ["Grand Place", "La Bourse"]@2001-01-01,
"location":"Point(2 2)", "PoIs": ["Palais Royal", "Manneken Pis"]@2001-01-02]' #-
ARRAY[text "\"PoIs\"", "1"];
-- ["La Bourse"@2001-01-01, "Manneken Pis"@2001-01-02]
Como se muestra a continuación, el resultado de una operación de eliminación puede ser un registro vacío o un arreglo vacío. Para eliminar estos valores, puede utilizarse la función minusValue.
SELECT tjsonb '{[{"unit": "km", "speed": 10, "light": true}@2001-01-01,
{"unit": "km", "speed": 20}@2001-01-02]}' - ARRAY[text 'unit', 'speed'];
-- {[{"light": true}@2001-01-01, {}@2001-01-02]}
SELECT tjsonb '[["Grand Place", "La Bourse"]@2001-01-01,
["Palais Royal"]@2001-01-02]' - 0;
-- [["La Bourse"]@2001-01-01, []@2001-01-02]
SELECT minusValues(tjsonb '{[{"unit": "km", "speed": 10, "light": true}@2001-01-01,
{"unit": "km", "speed": 20}@2001-01-02]}' - ARRAY[text 'unit', 'speed'],
jsonbset '{"[]","{}"}');
-- {[{"light": true}@2001-01-01, {"light": true}@2001-01-02)}
SELECT minusValues(tjsonb '[["Grand Place", "La Bourse"]@2001-01-01,
["Palais Royal"]@2001-01-02]' - 0, jsonbset '{"[]","{}"}');
-- {[["La Bourse"]@2001-01-01, ["La Bourse"]@2001-01-02)}
Existencia JSONB temporal
tjsonb ? jsonb → tbool tjsonb ?| jsonb[] → tbool tjsonb ?& jsonb[] → tbool
Como en PostgreSQL, los operadores ?| y ?& comprueban, respectivamente, si alguna o todas las cadenas del arreglo de texto existen como claves de nivel superior o elementos de arreglo.
SELECT tjsonb '"{\"geom\": \"Point(1 1)\"}"@2001-01-01' ? text 'geom';
-- t@2001-01-01
SELECT tjsonb '{{"geom": "Point(1 1)"}@2001-01-01, {"geom": "Point(2 2)"}@2001-01-02,
{"geom": "Point(1 1)"}@2001-01-03}' ?| ARRAY[text 'geom'];
-- {t@2001-01-01, t@2001-01-02, t@2001-01-03}
SELECT tjsonb '[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20, "units": "km/h"}@2001-01-02]' ?& ARRAY['speed', 'units'];
-- {[t@2001-01-01, t@2001-01-02]}
Contiene/contenido JSONB temporal
{tjsonb,jsonb} @> {tjsonb,jsonb} → tbool
{tjsonb,jsonb} <@ {tjsonb,jsonb} → tbool
SELECT tjsonb '"{\"geom\": \"Point(1 1)\"}"@2001-01-01' @> jsonb '{"geom": "Point(1 1)"}';
-- t@2001-01-01
SELECT tjsonb '{{"geom": "Point(1 1)"}@2001-01-01, {"geom": "Point(2 2)"}@2001-01-02,
{"geom": "Point(1 1)"}@2001-01-03}' @> jsonb '{"geom": "Point(1 1)"}';
-- {t@2001-01-01, f@2001-01-02, t@2001-01-03}
SELECT jsonb '{"geom": "Point(1 1)"}' <@ tjsonb '{[{"geom": "Point(1 1)"}@2001-01-01,
{"geom": "Point(1 1)"}@2001-01-02, {"geom": "Point(1 1)"}@2001-01-03],
[{"geom": "Point(2 2)"}@2001-01-04, {"geom": "Point(2 2)"}@2001-01-05]}';
-- {[t@2001-01-01, t@2001-01-03], [f@2001-01-04, f@2001-01-05]}
Asignación JSONB temporal
tjsonbSet(tjsonb,path text[],jsonb,create boolean=true) → tjsonb tjsonbSetLax(tjsonb,path text[],jsonb,create boolean=true,handle_null text) → tjsonb
Devuelve el valor tjsonb con el elemento especificado por la ruta reemplazado por jsonb, o añadido si create es verdadero y el elemento no existe. Todos los pasos anteriores de la ruta deben existir, o se devuelve el objetivo sin cambios. Como ocurre con los operadores orientados a rutas, los enteros negativos que aparecen en la ruta cuentan desde el final de los arreglos JSON. Si el último paso de la ruta es un índice de arreglo que está fuera de rango, y create_if_missing es verdadero, el nuevo valor se añade al principio del arreglo si el índice es negativo, o al final del arreglo si es positivo.
La función tjsonbSetLax se comporta de forma idéntica a tjsonbSet si el valor dado no es NULL; de lo contrario, se comporta según el valor de handle_null, que debe ser uno de 'raise_exception', 'use_json_null', 'delete_key' o 'return_source'. Como se indicó anteriormente, mantuvimos el comportamiento de PostgreSQL para esta función habilitando el valor 'return_source', mientras que para todas las demás operaciones de consulta, este valor se ha reemplazado por 'return_null'.
SELECT tjsonbSet(tjsonb '[{"speed":10}@2001-01-01, {"speed":20}@2001-01-02]',
ARRAY['units'], '"km/h"'::jsonb);
-- [{"speed": 10, "units": "km/h"}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]
SELECT tjsonbSet(tjsonb '[{"speed":10}@2001-01-01, {"speed":20}@2001-01-02]',
ARRAY['units'], '"km/h"'::jsonb, false);
-- [{"speed": 10}@2001-01-01, {"speed": 20}@2001-01-02]
SELECT tjsonbSet(tjsonb '[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20, "units": "km/h"}@2001-01-02]', ARRAY['units'], '"mi/h"'::jsonb);
-- [{"speed": 10, "units": "mi/h"}@2001-01-01, {"speed": 20, "units": "mi/h"}@2001-01-02]
SELECT tjsonbSetLax(tjsonb '[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20}@2001-01-02]', ARRAY['units'], 'null'::jsonb, true, 'delete_key');
-- [{"speed": 10, "units": "km/h"}@2001-01-01, {"speed": 20}@2001-01-02]
Inserción JSONB temporal
tjsonbInsert(tjsonb,path text[],jsonb,after boolean=false) → tjsonb
Devuelve el valor tjsonb con jsonb insertado. Si el elemento especificado por la ruta es un elemento de arreglo, el nuevo valor se insertará antes de ese elemento si after es falso, o después en caso contrario. Si el elemento especificado por la ruta es un campo de objeto, el nuevo valor se insertará solo si el objeto no contiene ya esa clave. Todos los pasos anteriores de la ruta deben existir, o se devuelve el objetivo sin cambios. Como ocurre con los operadores orientados a rutas, los enteros negativos que aparecen en la ruta cuentan desde el final de los arreglos JSON. Si el último paso de la ruta es un índice de arreglo que está fuera de rango, el nuevo valor se añade al principio del arreglo si el índice es negativo, o al final del arreglo si es positivo.
SELECT tjsonbInsert(tjsonb '[{"speed":10}@2001-01-01, {"speed":20}@2001-01-02]',
ARRAY['units'], '"km/h"'::jsonb);
-- [{"speed": 10, "units": "km/h"}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]
SELECT tjsonbInsert(tjsonb '[{"speed":10}@2001-01-01, {"speed":20}@2001-01-02]',
ARRAY['units'], '"km/h"'::jsonb, false);
-- [{"speed": 10}@2001-01-01, {"speed": 20}@2001-01-02]
SELECT tjsonbInsert(tjsonb '[{"speed": 10, "units": "km/h"}@2001-01-01,
{"speed": 20, "units": "km/h"}@2001-01-02]', ARRAY['units'], '"mi/h"'::jsonb);
-- [{"speed": 10, "units": "mi/h"}@2001-01-01, {"speed": 20, "units": "mi/h"}@2001-01-02]
Devolver un valor JSON temporal sin nulos
tjsonStripNulls(ttext,strip_in_arrays boolean=false) → ttext tjsonbStripNulls(tjsonb,strip_in_arrays boolean=false) → tjsonb
El último argumento indica si los elementos de arreglo nulos también se eliminan. Los valores nulos simples nunca se eliminan.
SELECT tjsonStripNulls(ttext '[{"speed": 10, "lights": null}@2001-01-01,
{"speed": 20, "PoIs": ["Grand Place", "La Bourse", null]}@2001-01-02]');
/* [{"speed": 10}@2001-01-01,
{"PoIs": ["Grand Place", "La Bourse", null], "speed": 20}@2001-01-02] */
SELECT tjsonbStripNulls(tjsonb '[{"speed": 10, "lights": null}@2001-01-01,
{"speed": 20, "PoIs": ["Grand Place", "La Bourse", null]}@2001-01-02]', true);
/* [{"speed": 10}@2001-01-01,
{"PoIs": ["Grand Place", "La Bourse"], "speed": 20}@2001-01-02] */
SELECT tjsonbStripNulls(tjsonb
'{{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-01,
{"road": "Bvd de la Cambre", "category": "primary"}@2001-01-02,
{"road": "rue de l''Abbaye", "category": null}@2001-01-03}');
/* [{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-01,
{"road": "Bvd de la Cambre", "category": "primary"}@2001-01-02,
{"road": "rue de l'Abbaye"}@2001-01-03] */
Como se muestra a continuación, la función no elimina los valores nulos simples. Para este propósito puede utilizarse la función minusValue.
SELECT tjsonStripNulls(ttext '[{"speed": 10}@2001-01-01, null@2001-01-02,
{"speed": 20, "PoIs": ["Grand Place", "La Bourse"]}@2001-01-03]');
/* [{"speed":10}@2001-01-01, null@2001-01-02,
{"speed":20,"PoIs":["Grand Place","La Bourse"]}@2001-01-03] */
SELECT minusValues(ttext '[{"speed": 10}@2001-01-01, null@2001-01-02,
{"speed": 20, "PoIs": ["Grand Place", "La Bourse"]}@2001-01-03]', 'null');
/* {[{"speed": 10}@2001-01-01, {"speed": 10}@2001-01-02),
[{"speed": 20, "PoIs": ["Grand Place", "La Bourse"]}@2001-01-03]}
¿Devuelve la ruta JSON algún elemento para el valor JSONB temporal especificado?
tjsonb @? jsonpath → tbool
tjsonbPathExists(tjsonb,vars jsonb='{}',silent boolean=false) → tbool
tjsonbPathExistsTz(tjsonb,vars jsonb='{}',silent boolean=false) → tbool
El operador @? suprime los siguientes errores: campo de objeto o elemento de arreglo faltante, tipo de elemento JSON inesperado, errores de fecha/hora y numéricos. Las funciones anteriores también pueden suprimir estos tipos de errores estableciendo el último argumento en verdadero. Este comportamiento puede ser útil al buscar en colecciones de documentos JSON de estructura variable.
SELECT tjsonb '[{"speed":10}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]' @?
'$.units ? (@ == "km/h")';
-- [f@2001-01-01, t@2001-01-02]
SELECT tjsonbPathExists(tjsonb
'{{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-01,
{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-02,
{"road": "Bvd de la Cambre", "category": "residential"}@2001-01-03}',
'$.category ? (@ == "residential")');
-- {f@2001-01-01, f@2001-01-02, t@2001-01-03}
-- TODO, it works without ".datetime()"
SELECT tjsonbPathExistsTz(tjsonb
'[{"speed":10, "cameraId": "25", "lastInspection": "2000-08-01 12:00:00"}@2001-01-01,
{"speed":20, "cameraId": "35", "lastInspection": "2000-03-01 12:00:00"}@2001-01-02]',
'$.lastInspection ? (@.datetime() > "2000-06-01".datetime() )');
-- [t@2001-01-01, f@2001-01-02]
Devolver el resultado de una comprobación de predicado de ruta JSON para un valor JSONB temporal
tjsonb @@ jsonpath → tbool
tjsonbPathMatch(tjsonb,vars jsonb='{}',silent boolean=false) → tbool
tjsonbPathMatchTz(tjsonb,vars jsonb='{}',silent boolean=false) → tbool
El operador @@ suprime los siguientes errores: campo de objeto o elemento de arreglo faltante, tipo de elemento JSON inesperado, errores de fecha/hora y numéricos. Las funciones anteriores también pueden suprimir estos tipos de errores estableciendo el último argumento en verdadero. Este comportamiento puede ser útil al buscar en colecciones de documentos JSON de estructura variable.
SELECT tjsonb '[{"speed":10}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]' @@
'$.units == "km/h"';
-- [f@2001-01-01, t@2001-01-02]
SELECT tjsonbPathMatch(tjsonb
'{{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-01,
{"road": "Bvd Gén. Jacques", "category": "primary"}@2001-01-02,
{"road": "Bvd de la Cambre", "category": "residential"}@2001-01-03}',
'$.category == "residential"');
-- {f@2001-01-01, f@2001-01-02, t@2001-01-03}
-- TODO, it works without ".datetime()"
SELECT tjsonbPathMatchTz(tjsonb
'[{"speed":10, "cameraId": "25", "lastInspection": "2000-08-01 12:00:00"}@2001-01-01,
{"speed":20, "cameraId": "35", "lastInspection": "2000-03-01 12:00:00"}@2001-01-02]',
'$.lastInspection.datetime() > "2000-06-01".datetime()');
-- [t@2001-01-01, f@2001-01-02]
Devolver todos los elementos devueltos por una ruta JSON de un valor JSONB temporal, como un arreglo JSON
tjsonbPathQueryArray(tjsonb,vars jsonb='{}',silent boolean=false) → tjsonb
tjsonbPathQueryArrayTz(tjsonb,vars jsonb='{}',silent boolean=false) → tjsonb
La función anterior puede suprimir los siguientes errores estableciendo el último argumento en verdadero: campo de objeto o elemento de arreglo faltante, tipo de elemento JSON inesperado, errores de fecha/hora y numéricos. Este comportamiento puede ser útil al buscar en colecciones de documentos JSON de estructura variable.
SELECT tjsonbPathQueryArray(tjsonb
'[{"speed":10}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]',
'$ ? (@.speed >= $min && @.speed <= $max)', '{"min":10, "max":30}');
-- [[{"speed": 10}]@2001-01-01, [{"speed": 20, "units": "km/h"}]@2001-01-02]
-- TODO, it works without "_tz"
SELECT tjsonbPathQueryArrayTz(tjsonb
'[{"cameraId":25, "inspections":["2000-01-03", "2000-01-06", "2000-01-09"]}@2001-01-01,
{"cameraId":35, "inspections":["2000-01-04", "2000-01-07", "2000-01-10"]}@2001-01-02]',
'$.inspections ? (@.timestamp_tz() >= $min.timestamp_tz() &&
@.timestamp_tz() <= $max.timestamp_tz())', '{"min":"2000-01-05", "max":"2000-01-09"}');
-- [["2000-01-06", "2000-01-09"]@2001-01-01, ["2000-01-07"]@2001-01-02]
Devolver el primer elemento devuelto por una ruta JSON de un valor JSONB temporal
tjsonbPathQueryFirst(tjsonb,vars jsonb='{}',silent boolean=false) → tjsonb
tjsonbPathQueryFirstTz(tjsonb,vars jsonb='{}',silent boolean=false) → tjsonb
Las funciones anteriores pueden suprimir los siguientes errores estableciendo el último argumento en verdadero: campo de objeto o elemento de arreglo faltante, tipo de elemento JSON inesperado, errores de fecha/hora y numéricos. Este comportamiento puede ser útil al buscar en colecciones de documentos JSON de estructura variable.
SELECT tjsonbPathQueryFirst(tjsonb
'[{"speed":10}@2001-01-01, {"speed": 20, "units": "km/h"}@2001-01-02]',
'$.speed ? (@ >= $min && @ <= $max'), '{"min":10, "max":30}');
-- [[{"speed": 10}]@2001-01-01, [{"speed": 20, "units": "km/h"}]@2001-01-02]
-- TODO, it works without "_tz"
SELECT tjsonbPathQueryArrayTz(tjsonb
'[{"cameraId":25, "inspections":["2000-01-03", "2000-01-06", "2000-01-09"]}@2001-01-01,
{"cameraId":35, "inspections":["2000-01-04", "2000-01-07", "2000-01-10"]}@2001-01-02]',
'$.inspections ? (@.datetime() >= $min.datetime() && @.datetime() <= $max.datetime())',
'{"min":"2000-01-05", "max":"2000-01-09"}');
-- [["2000-01-06", "2000-01-09"]@2001-01-01, ["2000-01-07"]@2001-01-02]