2014-09-22 17 views
11

Ich habe eine Postgres-Tabelle mit einer Spalte vom Typ JSON, die eine Reihe von JSON-Objekten enthält. Ich möchte die Tabellensätze abfragen und die Ergebnisse nach einem Wert sortieren, der im JSON-Feld gespeichert ist. Ich bekomme die Abfragen ausgeführt, aber sie sortieren nicht richtig. Ich finde nicht eine Menge Dokumentation über JSON-Feldtypen speziell zu bestellen, also hoffe, jemand ist in diese geraten.Sortieren nach JSON-Datentyp postgres

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

Die folgenden SQL ausgeführt wird, aber die Ergebnisse zurück ungeordnete

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

Ich bin mit Schienen, sondern w/gleiches Ergebnis

Antwort

26

Sie setzen asc in den SQL direkt als auch versuchte, läuft Feldname. Es gibt keinen Schlüssel namens value asc in der JSON, so data ->> 'value asc' wird immer NULL zurückgeben.

Sie eigentlich wollen:

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

die json anzupassen, möglicherweise sogar:

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

Ich hatte das auch versucht. Es läuft, aber sortiert die Datensätze nicht korrekt. (durch die Werte für Sachen) Muss ich den Wert oder etwas werfen? – user1767105

+0

@ user1767105 Siehe Aktualisierung. Sie versuchen, einen nicht vorhandenen Schlüssel "stuff" zu erhalten, so dass es gleichbedeutend mit "ORDER BY NULL" ist. –

+0

hab es geschafft. Entschuldigung, ich hatte die Datenobjekte oben falsch. wirklich waren es daten: {"stuff" => {"name" => "stuff", "wert": "super stuff"}} abfrage landet als auswahl .... order by data -> "stuff" -> > "Wert" Deine Hilfe hat mich dort hingebracht, also danke! zusätzlich eine gute Ressource auch: http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ – user1767105

6

Versuchen:

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

+1

@EugenKonkov reparierte die Frage u. Die Antworten –

1

Verwenden -> statt ->> (->> bekommt ein JSON-Objektfeld als tex t):

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

Während dies die Frage direkt beantwortet, bin ich dankbar, dass ich dieses fand. Es half mir, eine JSON-Spalte zu lösen, die alphabetisch sortiert wurde, wenn es sich um eine Nummer handelt. – datashaman