Solución:
Convertir una fila a json
No me parece que quieras agregar JSON. Dices que quieres el equivalente de row_to_json
, si es así, le sugiero que consulte el método mucho más sencillo JSON_OBJECT
SELECT JSON_OBJECT(
'name_field', name_field,
'address_field', address_field,
'contact_age', contact_age
)
FROM contact;
Agregando JSON
Como nota al margen, si necesita agregar un conjunto de resultados a json. entonces el próximo MySQL 8 lo hará por usted.
-
JSON_ARRAYAGG()
Devuelve el conjunto de resultados como una única matriz JSON -
JSON_OBJECTAGG()
`Devuelve el conjunto de resultados como un solo objeto JSON
Tomó un poco de averiguar (más acostumbrado a PostgreSQL dónde están las cosas mucho más fácil!), pero si consulta el manual fino aquí, en 12.16.2 Functions That Create JSON Values
, esta el JSON_ARRAY
función, pero en realidad no sirve de mucho, ¡al menos en este caso!
Para responder la pregunta "select and it return JSON"
, hay dos formas de hacer esto, ¡ambas bastante dolorosas!
Tu también puedes
-
use un “truco” – vea el db-fiddle aquí,
-
o use una de las nuevas funciones JSON proporcionadas por MySQL aquí, que, irónicamente, parece ser incluso más un truco que el propio truco. ¡Solo con MySQL! 🙂 (violín aquí).
Ambas respuestas usan MySQL GROUP_CONCAT
función – esta publicación ayudó. ¡Es posible que desee establecer la variable de sistema group_concat_max_len en un poco más de su valor predeterminado (un insignificante 1024)!
La primera consulta es, como puedes imaginar, desordenada (DDL
y DML
al final de esta respuesta):
SELECT CONCAT('[', better_result, ']') AS best_result FROM
(
SELECT GROUP_CONCAT('{', my_json, '}' SEPARATOR ',') AS better_result FROM
(
SELECT
CONCAT
(
'"name_field":' , '"', name_field , '"', ','
'"address_field":', '"', address_field, '"', ','
'"contact_age":' , contact_age
) AS my_json
FROM contact
) AS more_json
) AS yet_more_json;
Resultado:
[{"name_field":"Mary","address_field":"address one","contact_age":25},{"name_field":"Fred","address_field":"address two","contact_age":35},{"name_field":"Bill","address_field":"address three","contact_age":47}]
lo cual es correcto, pero, seamos sinceros, ¡una pesadilla!
Luego está el MySQL JSON_ARRAY()
enfoque (que es aún más complicado, gracias MySQL por su (inexistente) implementación del TRANSLATE()
¡función!).
SELECT
CONCAT
('[', REPLACE
(
REPLACE
(
GROUP_CONCAT
(
JSON_ARRAY
(
'name_field:', name_field,
'address_field:', address_field,
'age_field:', contact_age
) SEPARATOR ','
), '[', '{'
), ']', '}'
), ']'
)
AS best_result2
FROM contact
¡Mismo resultado!
==== TABLE CREATION and INSERT DDL and DML ============
CREATE TABLE contact
(
name_field VARCHAR (5) NOT NULL,
address_field VARCHAR (20) NOT NULL,
contact_age INTEGER NOT NULL
);
INSERT INTO contact
VALUES
('Mary', 'address one', 25),
('Fred', 'address two', 35),
('Bill', 'address three', 47);
Para una matriz de objetos JSON (un objeto por fila en la consulta), puede hacer esto:
SELECT JSON_ARRAYAGG(JSON_OBJECT("fieldA", fieldA, "fieldB", fieldB))
FROM table;
Daría como resultado una única matriz JSON que contiene todas las entradas:
[
{
"fieldA": "value",
"fieldB": "value"
},
...
]
Desafortunadamente, MySQL no permite seleccionar todos los campos con *
. Esto sería genial, pero no no trabaja:
SELECT JSON_ARRAYAGG(JSON_OBJECT(*)) FROM table;