2012-06-04 8 views
5

Acabo de tener la idea de escribir una función en MySQL que pueda pasar una subconsulta para que muestre la representación JSON de esa subconsulta.¿Es posible escribir una función SQL que emita JSON?

Tengo un montón de datos que a menudo obtengo de MySQL, luego los convierto en JSON para la salida API. ¿Podría ser un aumento de velocidad escribir una función MySQL para hacer esto en el servidor SQL que simplemente devuelve el JSON?

Mi imaginación:

query('SELECT * FROM people'); 

// Output: 
// +----+--------+-----+ 
// | id | name | Age | 
// +----+--------+-----+ 
// | 1 | Molly | 24 | 
// | 2 | Edward | 28 | 
// +----+--------+-----+ 

query('JSON(SELECT * FROM people)'); 

// Output: 
// [{"id":1,"name":"Molly","Age":24},{"id":2,"name":"Edward","Age":28}] 

Posible? Si es así, ¿hay alguna pista sobre cómo puedo comenzar?

+1

Es posible, pero difícilmente será un aumento de velocidad. Además, para grandes conjuntos de resultados, puede alcanzar ciertos límites como 'group_concat_max_len' y' max_allowed_packet', lo que evitaría que se devuelva el valor. No siempre son posibles cambiar en alojamientos compartidos, etc. – Quassnoi

+0

No estoy seguro de cómo los datos se envían generalmente desde MySQL a un cliente como respuesta a una consulta. ¿Esto quizás reduciría el ancho de banda si el host MySQL no fuera local? – Hubro

+0

El protocolo binario de 'MySQL' es más denso que el' JSON' basado en caracteres. Además, puedes comprimirlo con 'MYSQL_CLIENT_COMPRESS' (en caso de que lo necesites). – Quassnoi

Respuesta

2

Primero, mira this thread (SQL Server) en StackOverflow.

También puede ver here para PL/JSON, y here para sql2json (PHP).

2

Piense en una tabla con nombre de usuario y correo electrónico, puede configurar el JSON de la siguiente manera en la función definida por el usuario MySQl.

SELECT 
    CONCAT("[", 
      GROUP_CONCAT(
       CONCAT("{username:'",username,"'"), 
       CONCAT(",email:'",email),"'}") 
     ) 
    ,"]") 
AS json FROM users; 

Una consulta de MySQL que devuelve JSON.

[ 
    {username:'mike',email:'[email protected]'}, 
    {username:'jane',email:'[email protected]'}, 
    {username:'stan',email:'[email protected]'} 
] 

no hay ningún método incorporado que convierte el resultado en formato JSON, por lo que tiene que hacer usted mismo en el UDF.

+0

Awesome gracias. Probablemente sea mejor usar comillas también para claves de objeto. De lo contrario, se ve perfecto! – lethalman

1

No veo sentido escribir SQL para generar JSON, es sucio y feo y sería muy difícil generalizar en una función de uso múltiple, y no es realmente para lo que SQL está diseñado; SQL está diseñado para administrar, almacenar y recuperar los registros que necesita y realizar cálculos en los conjuntos de resultados, muy rápido y sobre la marcha, y no mucho más. Si necesita JSON, debe escupir las filas a un script del lado del servidor de todos modos, así que también puede usar el lenguaje de scripting para crear JSON, para eso son los lenguajes de scripting .

+0

énfasis interesante de 'para' al final allí. –

+0

Realmente creo que la pregunta tiene, al menos, un punto relacionado con el rendimiento. ¿Por qué debería necesitar e.g 100kB de datos leídos en la memoria del servidor DB, enviados a través de IP y luego cargados de nuevo en PHP/JS/cualquier memoria, solo para convertirlos a formato JSON, cuando SQL puede hacerlo y probablemente mucho más rápido. – Panais

+0

en este momento cuando las herramientas como graphql se publicitan, este tipo de pregunta parece mucho más relevante: ¿por qué necesita una herramienta para superponer mysql cuando realmente puede hacer el trabajo por sí mismo? – Ben

1

A partir de MySQL 5.7 puede generar JSON utilizando JSON_ARRAY y JSON_MERGE, entre otras funciones.

Funciona así:

RETURN JSON_ARRAY('id':1,'name':'Molly','Age':24); 

Es posible tener varios documentos también:

RETURN JSON_MERGE('{"id":1,"name":"Molly","Age":24}', '{"id":2,"name":"Edward","Age":28}'); 
Cuestiones relacionadas