2015-11-04 13 views
5

Ho seguito DB struttura:trasformare i dati JSON per separare le colonne

ID Name Value 
1 TV1 {"URL": "www.url.com", "Icon": "some_icon"} 
2 TV2 {"URL": "www.url.com", "Icon": "some_icon", "Facebook": "Facebook_URL"} 
3 TV3 {"URL": "www.url.com", "Icon": "some_icon", "Twitter": "Twitter_URL"} 
.......... 

Sto cercando una query con le funzioni native di SQL Server 2012 per estrarre il JSON dalla colonna Value, e creare dinamicamente le colonne, e voglio farlo per diverso conteggio delle colonne senza codificare i nomi delle colonne name, icon, twitter, facebook. Così il risultato sto cercando come:

ID Name URL   Icon   Facebook  Twitter 
1 TV1 www.url.com some_icon   NULL   NULL 
2 TV2 www.url.com some_icon Facebook_URL   NULL 
3 TV3 www.url.com some_icon   NULL Twitter_URL 

Se ciò non è possibile con meccanismi nativi di SQL Server, PostgreSQL forse può farlo, o altro RMDBS

PS. La mia domanda non è duplicata di Parse JSON in TSQL. Ho bisogno di trovare il modo per analizzare che JSON eterogenea in righe

+0

Cosa stai cercando di fare? vuoi importare questa struttura json in una tabella di SQL Server o cosa? –

+0

Devo scrivere una query per estrarre JSON dalla colonna e creare colonne dinamiche. Tutti i dettagli nella descrizione. Grazie! – SpanishBoy

+0

Dovrebbe essere possibile con SQL Server 2016 afaik [Supporto JSON in SQL Server 2016] (http://blogs.msdn.com/b/jocapc/archive/2015/05/16/json-support-in-sql-server -2016.aspx) –

risposta

6

In SQL Server 2016 si sarebbe in grado di definire schema in fase di query quando si apre jSON:

select id, name, url, icon, facebook, twitter 
from tab 
    cross apply openjson(value) 
       with (url nvarchar(100), icon varbinary, 
         facebook nvarchar(100),twitter nvarchar(100)) 

si noti che non si può avere lo schema di ritorno dinamica - è necessario specificare quali campi devono essere restituiti in TVF. In alternativa è possibile utilizzare openjson senza clausola WITH restituire dinamicamente tutte coppie chiave: valore dall'oggetto JSON:

select id, name, json.[key], json.value 
from tab 
    cross apply openjson(value) as json 

In questa versione, OPENJSON restituirà valori oscillanti. coppie chiave: valore non saranno restituiti come colonna: cell - ogni chiave: coppia di valori verrà restituito in righe separate:

ID Name key  value 
1 TV1 URL  www.url.com 
1 TV1 Icon  some_icon 
2 TV2 URL  www.url.com 
2 TV2 Icon  some_icon 
2 TV3 Facebook Facebook_URL 
3 TV3 URL  www.url.com 
3 TV3 Icon  some_icon 
3 TV3 Twitter Twitter_URL 
.... 

Sarà anche nelle Azure SQL Database presto. Nella versione precedente è necessario trovare o scrivere CLR TVF che analizzi JSON o utilizzi un T-SQL estremamente complicato. Posso consigliare JsonSelect e json4sql se si desidera utilizzare le soluzioni CLR esistenti. Altra alternativa per la versione precedente di SQL Server consiste nell'utilizzare XML anziché JSON e utilizzare la funzione nodes().

Problemi correlati