Esta inquietud se puede abordar de diferentes formas, pero te mostramos la solución más completa en nuestra opinión.
Solución:
Convertir una fila a json
No me parece que quieras agregar JSON. Usted declara que quiere el equivalente de row_to_json
si es así, sugiero revisar el mucho más simple 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 un solo JSON arrayJSON_OBJECTAGG()
` Devuelve el conjunto de resultados como un solo objeto JSON
Tomó un poco de averiguar (más acostumbrado a PostgreSQL donde las cosas están mucho más fácil!), pero si consulta el fino manual aquí, bajo 12.16.2 Functions That Create JSON Values
ahí está el JSON_ARRAY
función, pero en realidad no sirve de mucho, ¡al menos en este caso!
Para responder a 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 truco en sí. ¡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 que su valor predeterminado (un mísero 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 especie de pesadilla!
Luego está el MySQL JSON_ARRAY()
enfoque (que es aún más complicado – gracias MySQL por su (inexistente) implementación de la 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);
Por un array 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 un solo JSON array que contiene todas las entradas:
[
"fieldA": "value",
"fieldB": "value"
,
...
]
Desafortunadamente, MySQL no permite seleccionar todos los campos con *
. Esto sería increíble, pero no no trabajar:
SELECT JSON_ARRAYAGG(JSON_OBJECT(*)) FROM table;
Recuerda que puedes difundir esta crónica si si solucionó tu problema.