2014-09-22 15 views
11

Ho una tabella che ha Postgres colonna di tipo JSON che ha un gruppo di oggetti JSON in loro. Voglio interrogare i record della tabella e ordinare i risultati con un valore memorizzato nel campo JSON. Sto ottenendo le query per l'esecuzione, ma non ordinano correttamente. Non sto trovando un sacco di documentazione su come ordinare i tipi di campo JSON in modo specifico, quindi spero che qualcuno si sia imbattuto in questo.ordina per JSON tipo di dati postgres

data: {name: "stuff", value: "third option"} 
data: {name: "stuff", value: "awesome stuff"} 
data: {name: "stuff", value: "way cooler stuff"} 

I seguenti esegue SQL, ma i risultati non ordinata tornano

select * from table ORDER BY data->>'value asc' 

sto usando le rotaie, ma hanno provato a fare funzionare SQL direttamente così w/stesso risultato

risposta

26

Hai messo nel asc fieldname. Non è presente alcuna chiave denominata value asc in JSON, quindi data ->> 'value asc' restituirà sempre NULL.

In realtà si vuole:

select * from table ORDER BY data->>'value' ASC 

per abbinare il JSON, forse anche:

select * 
from table 
WHERE data ->> 'name' = 'stuff' 
ORDER BY data->>'value' ASC 
+0

Avevo provato anche quello. funziona, ma ancora non ordina correttamente i record. (dai valori per le cose) ho bisogno di trasmettere il valore o qualcosa del genere? – user1767105

+0

@ user1767105 Vedere l'aggiornamento. Stai cercando di ottenere una "chiave" inesistente, quindi sarà equivalente a "ORDER BY NULL". –

+0

capito. scusa ho avuto gli oggetti dati errati sopra. in realtà era data: {"stuff" => {"name" => "stuff", "value": "awesome stuff"}} query termina come select .... order by data -> "stuff" -> > "valore" il tuo aiuto mi ha portato lì, però grazie! inoltre una buona risorsa: http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ – user1767105

6

Prova:

ORDER BY cast(data->>'value' as integer) ASC

+1

@EugenKonkov fissata la domanda e le risposte –

1

Uso -> invece di ->> (->> ottiene un Campo oggetto JSON come tex t):

select * from my_table ORDER BY data->'some_number' asc; 
+0

Anche se questo non risponde direttamente alla domanda, sono grato ho trovato questo. Mi ha aiutato a risolvere una colonna JSON in ordine alfabetico quando si tratta di un numero. – datashaman

Problemi correlati