Saltar al contenido

MySQL: devuelva JSON desde una consulta SQL estándar

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_jsonsi 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 array
  • JSON_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 Valuesahí 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *