2013-11-27 29 views
21

Posso usare to_json(1) per eseguire il cast di int a json, ma come posso convertire json in int? Questo può essere troppo lento:Come convertire postgres json in intero

to_json(1)::text::int 

Inoltre, è json avvolta da un blocco binario (BSON) o un semplice involucro di testo?

risposta

5

to_json (1) :: :: testo int forse troppo lento

Ma allora, è l'unico modo.

La seconda parte della domanda non è chiara.

4

Il supporto JSON PostgreSQL 9.3 è un testo json validato semplicemente.

Nella versione 9.4 e successive è possibile utilizzare jsonb.

"potrebbe essere troppo lento" non ha un senso. Cosa ti fa pensare che sia troppo lento? Hai testato e punto di riferimento? Se è "troppo lento", quale velocità dovrebbe essere non troppo lento, cioè cosa ti aspetti?

+0

ringraziamento spero che la nuova versione sia pubblicata presto. poiché c'è una trasformazione tra stringa e numero, sarà certamente più lento del tipo intero diretto, come tutti sanno. Questo può essere accettato in caso di utilizzo reale, stiamo cercando un modo più veloce. ho posto questa domanda nella domanda json-to-int, perché sospettavo che json fosse incapsulato da testo, questo lasciava che json-to-int eseguisse il cast dal testo, altrimenti la struttura del negozio dovrebbe essere già digitata. – Inshua

+0

'jsonb' ora esiste. Supporta direttamente l'estrazione di interi da json? –

+0

@Craig Ringer - ha problemi se il valore è nullo: select ('[null]' :: json-> 0) :: text :: int solleva la sintassi di input non valida per intero: "null" che ha senso .. funziona: select ('[null]' :: json - >> 0) :: int ... restituisce null – Reinsbrain

6

Ciò che funziona per me (utilizzando posgtgresql 5.6) è

SELECT (tablename.jsoncolumnname->>'jsonfiledname')::int FROM tablename; 

come

SELECT (users.data->>'failed_login_attempts_count')::int FROM users; 

Supponendo users tabella ha una colonna JSON chiamato data che è qualcosa di simile:

{"failed_login_attempts_count":"2","comment":"VIP"}