2012-06-04 18 views
5

Ho appena avuto l'idea di scrivere una funzione in MySQL che possa passare ad una subquery per generare la rappresentazione JSON di quella sottoquery.È possibile scrivere una funzione SQL che emette JSON?

Ho un sacco di dati che prelevo spesso da MySQL, quindi lo converto in JSON per l'output dell'API. Potrebbe essere forse un aumento di velocità scrivere una funzione MySQL per farlo sul server SQL che restituisce solo il JSON?

La mia fantasia:

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}] 

possibile? Se sì, qualche indizio su come posso iniziare?

+1

E 'possibile, ma difficilmente sarà alcun aumento della velocità. Inoltre, per set di risultati di grandi dimensioni, puoi raggiungere determinati limiti come 'group_concat_max_len' e' max_allowed_packet' che impediscono il ritorno del valore. Non è sempre possibile modificare host in hosting ecc. – Quassnoi

+0

Non sono sicuro di come i dati vengano normalmente inviati da MySQL a un client come risposta a una query. Questo forse ridurrebbe la larghezza di banda se l'host MySQL non fosse locale? – Hubro

+0

Il protocollo binario di 'MySQL' è più denso di' JSON' basato sui caratteri. Inoltre, puoi comprimerlo con 'MYSQL_CLIENT_COMPRESS' (se ne hai bisogno). – Quassnoi

risposta

2

Innanzitutto, guardare this thread (SQL Server) su StackOverflow.

È anche possibile vedere here per PL/JSON e here per sql2json (PHP).

2

Pensa a un tavolo con nome utente ed e-mail, puoi definire il JSON nel modo seguente in MySQl Funzione definita dall'utente.

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

Una query MySQL che restituisce JSON.

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

Non esiste un metodo integrato che converte il risultato in formato JSON, quindi bisogna fare da soli in UDF.

+0

Grazie di cuore. Probabilmente è meglio usare le virgolette anche per le chiavi dell'oggetto. Altrimenti sembra perfetto! – lethalman

1

Non vedo il punto nello scrivere SQL per generare JSON, è solo disordinato e brutto e sarebbe davvero difficile generalizzare in una funzione per tutti gli usi, e non è proprio ciò per cui è stato progettato SQL; SQL è progettato per gestire, archiviare e recuperare i record di cui hai bisogno ed eseguire calcoli sui set di risultati - molto veloce e al volo - e non molto altro. Se hai bisogno di JSON, devi comunque sputare le righe su uno script sul lato server in modo da poter usare il linguaggio di scripting per creare JSON - questo è il linguaggio di scripting per .

+0

Interessante enfasi di "per" alla fine lì. –

+0

Penso davvero che la domanda abbia un punto - almeno - relativo alle prestazioni. Perché dovrei aver bisogno di e.g I dati da 100kB letti nella memoria del DB Server, inviati su IP e quindi caricati di nuovo in PHP/JS/qualsiasi memoria, solo per convertirli in formato JSON, quando SQL può farlo e probabilmente molto più velocemente !! – Panais

+0

in questo momento, quando strumenti come graphql viene pubblicizzato, questo tipo di domanda sembra molto più pertinente - perché è necessario uno strumento per sovrapporre mysql quando può effettivamente svolgere il lavoro da solo? – Ben

1

A partire da MySQL 5.7 è possibile emettere JSON utilizzando JSON_ARRAY e JSON_MERGE tra le altre funzioni.

Funziona in questo modo:

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

si può avere più documenti anche:

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