Saltar al contenido

MySQL: devuelve JSON de una consulta SQL estándar

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;
¡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 *