La valeur Json peut être constituée d'une valeur de chaîne. par exemple.:
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
Comment puis-je extraire cette chaîne en tant que valeur de texte postgres?
::TEXT
ne fonctionne pas. Il renvoie json cité, pas la chaîne d'origine:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
Merci.
PS J'utilise PostgreSQL 9.3
json
postgresql
e79ene
la source
la source
Réponses:
Il n'y a aucun moyen dans PostgreSQL de déconstruire un objet JSON scalaire. Ainsi, comme vous le faites remarquer,
select length(to_json('Some "text"'::TEXT) ::TEXT);
est 15,
L'astuce consiste à convertir le JSON en un tableau d'un élément JSON, puis à extraire cet élément en utilisant
->>
.select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
retournera 11.
la source
json_extract_path_text()
ne puisse pas référencer l'élément racine (AFAIK).from_json
se est proposé, mais non mis en œuvre wiki.postgresql.org/wiki/JSON_API_BrainstormEn 9.4.4, l'utilisation de l'
#>>
opérateur fonctionne pour moi:select to_json('test'::text) #>> '{}';
À utiliser avec une colonne de table:
select jsoncol #>> '{}' from mytable;
la source
to_json(...)
est simplement un moyen simple de créer une valeur JSON à utiliser comme exemple dans une instruction courte d'une ligne. Vous le remplaceriez certainement par le nom d'une colonne JSON si vous interrogiez une table comme vous le décrivez. De plus, pour dissiper un point de confusion potentiel, votre distribution(...)::text
est redondante car l'#>>
opérateur renvoie du texte par définition (et c'est la raison pour laquelle l'opérateur a été utilisé en premier lieu). Vous pouvez conserver les parenthèses mais supprimer la distribution::text
.#>>
et'{}'
fait? Je ne peux pas tout à fait suivre cela et aucun de ces termes n'est compatible avec Google. Cette réponse a résolu mon problème, je veux juste savoir pourquoi.#>>
opérateur est ici .text
. Cela peut ressembler à une chaîne, mais c'est un objet JSON. Pour convertir cet objet de JSON en texte, utilisez l'#>>
opérateur. Mais cet opérateur a besoin de vous pour spécifier un chemin. Le chemin vers cet objet racine est{}
. DoncSELECT '"test"'::jsonb #>> '{}'
signifie "obtenir l'objet à la racine du chemin et le convertir en texte".M. Curious était également curieux à ce sujet. En plus de l'
#>> '{}'
opérateur, dans 9.6+ on peut obtenir la valeur d'une chaîne jsonb avec l'->>
opérateur:select to_jsonb('Some "text"'::TEXT)->>0; ?column? ------------- Some "text" (1 row)
Si l'on a une valeur json, alors la solution consiste à convertir d'abord en jsonb:
select to_json('Some "text"'::TEXT)::jsonb->>0; ?column? ------------- Some "text" (1 row)
la source
Une manière simple de faire ceci:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
Convertissez simplement la chaîne json en une liste json
la source
- >> fonctionne pour moi.
version postgres:
Requete:
select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
Production:
la source
->
et->>
lors de l'utilisation d'une clé. Voir cette réponse ou cette réponse .