SELECT json_array_elements('["one", "two"]'::json)
donne un résultat
| json_array_elements | | : --------------- | "un" | | "deux" |
Je voudrais avoir la même chose mais sans les guillemets:
one
two
On dirait que je ne peux pas utiliser --- (->>
ici parce que je n'ai pas de noms de champs dans le JSON. C'est juste un tableau de chaînes.
Version Postgres: PostgreSQL 10.0 sur x86_64-Apple-darwin, compilé par i686-Apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Basé sur Apple Inc. build 5658) ( LLVM build 2336.11.00), 64 bits
La sortie par défaut de la contrainte json->text
Avec un guillemet double ("
) Parce que la contrainte de text
vers une chaîne json
vous oblige à mettre entre guillemets votre entrée. Pour vous débarrasser des guillemets doubles, utilisez TRIM
SELECT x, trim('"' FROM x::text)
FROM json_array_elements('["one", "two"]'::json) AS t(x);
x | btrim
-------+-------
"one" | one
"two" | two
(2 rows)
Point important cependant, vous perdez une utilité si vous le faites. Tous les types JSONB sont renvoyés sous une forme textuelle qui peut être utilisée pour revenir à jsonb
avec la contrainte text->jsonb
. C'est une fonction de cartographie bijective. Perdre cela signifie que null
et "null"
Sont les mêmes, tout comme 1
Et "1"
.
SELECT x, trim('"' FROM x::text)
FROM json_array_elements('[null, "null", 1, "1"]') AS t(x);
x | btrim
--------+-------
null | null
"null" | null
1 | 1
"1" | 1
(4 rows)
Si vous voulez savoir ce qui se passe. Tous les types peuvent fournir un _out
Qui les amène à text
ou _send
Qui les amène à une représentation binaire et une réciproque _in
Et _recv
qui les reprend de ces formulaires et les mappe aux types. Ici, vous obtenez jsonb_out
,
jsonb_out
qui appelle JsonbToCstring
JsonbToCstring
qui appelle JsonbToCStringWorker
JsonbToCStringWorker
qui appelle jsonb_put_escaped_value
jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)
qui appelle escape_json
escape_json(StringInfo buf, const char *str)
qui ajoute le "
et il est codé en dur. Pas d'autre moyen. SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);
Résultat:
col
---
one
two