2012-06-04 60 views
5

我剛剛在MySQL中編寫函數的想法,我可以通過子查詢來輸出該子查詢的JSON表示。是否可以編寫輸出JSON的SQL函數?

我有相當多的數據,我經常從MySQL中獲取,然後將其轉換爲JSON API輸出。編寫一個MySQL函數,在剛剛返回JSON的SQL服務器上執行此操作可能會提高速度嗎?

我的想象:

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

可能嗎?如果是的話,我可以開始的任何線索?

+1

這是可能的,但將難以有任何的速度增加。另外,對於大的結果集,你可以命中某些限制,比如'group_concat_max_len'和'max_allowed_pa​​cket',這會阻止返回值。他們並不總是可以在共享主機等上進行更改。 – Quassnoi

+0

我不確定通常如何將數據從MySQL發送到客戶端作爲對查詢的響應。如果MySQL主機不是本地的,這可能會減少帶寬嗎? – Hubro

+0

'MySQL'的二進制協議比基於字符的'JSON'更密集。另外,你可以使用'MYSQL_CLIENT_COMPRESS'來壓縮它(如果你需要的話)。 – Quassnoi

回答

2

首先,在StackOverflow上查看this thread(SQL Server)。

您還可以查看PL/JSON的here,以及sql2json(PHP)的here

2

想想用戶名和電子郵件的表格,您可以在MySQl用戶定義的函數中以下列方式構造JSON。

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

返回JSON的MySQL查詢。

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

沒有內置方法將結果轉換爲JSON格式,因此您必須在UDF中自己做。

+0

非常感謝。可能最好也使用引號來表示對象鍵。否則它看起來很完美! – lethalman

1

我沒有看到編寫SQL生成JSON的要點,它只是混亂和醜陋,並且很難推廣到一個通用函數中,而且它並不是真正爲SQL設計的; SQL旨在管理,存儲和檢索您需要的記錄,並在結果集上執行計算 - 非常快速並且即時 - 而不是更多。如果你需要JSON,你必須將這些行吐出到服務器端腳本,所以你不妨使用腳本語言來創建JSON--這就是腳本語言

+0

有趣的重點'結束'在那裏。 –

+0

我真的認爲這個問題至少與性能有關。爲什麼我需要e。g 100kB數據讀入DB Server內存,通過IP發送,然後再次加載到PHP/JS /無論內存中,只是爲了將它們轉換爲JSON格式,當SQL可以做到這一點,並可能快很多! – Panais

+0

此時像graphql這樣的工具被炒作,這種問題看起來更加相關 - 爲什麼需要一個工具來覆蓋mysql時,它實際上可以自己完成這項工作? – Ben

1

從MySQL 5.7開始,您可以使用JSON_ARRAYJSON_MERGE以及其他函數輸出JSON。

它的工作原理就像這樣:

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

你可以有多個文件也:

RETURN JSON_MERGE('{"id":1,"name":"Molly","Age":24}', '{"id":2,"name":"Edward","Age":28}'); 
相關問題