web-dev-qa-db-fra.com

PostgreSQL 9.2 - Convertir une chaîne TEXTE en json en dactylographie json/hstore

J'ai une colonne TEXT contenant une chaîne JSON valide.

CREATE TABLE users(settings TEXT);

INSERT INTO users VALUES ('{"language":"en","gender":"male"}');
INSERT INTO users VALUES ('{"language":"fr","gender":"female"}');
INSERT INTO users VALUES ('{"language":"es","gender":"female"}');
INSERT INTO users VALUES ('{"language":"en","gender":"male"}');

Je souhaite transformer certains champs en un format pouvant être interrogé.

Un REGEXP_REPLACE pour chaque champ suffirait (champs language et gender). Mais comme c'est valide JSON, y a-t-il moyen de:

  • Convertir en type JSON
  • Convertir en type hstore
  • Ou tout autre moyen réalisable

SQLFiddle: http://sqlfiddle.com/#!12/54823

23
huy
SELECT cast(settings AS json) from users;
28
Reza S

Ou de la manière la plus courte que Reza:

SELECT settings::json FROM users;

Ensuite, pour sélectionner une langue par exemple:

SELECT settings::json->>'language' FROM users;

Plus de détails sur la documentation officielle .

18

Voici une solution de Postgresql: Conversion de colonnes TEXT en JSON :

ALTER TABLE table1 ALTER COLUMN col1 TYPE JSON USING col1::JSON;
14
Hua Zhang

Si vous avez besoin d’un index, créez une fonction immuable qui prend json en entrée et renvoie le champ souhaité en sortie dans un langage pl, par exemple:

create function extract_language(text) returns text as $$
  -- parse $1 as json
  -- return $1.language
$$ language whatever immutable;

Ajoutez ensuite un index sur l'expression:

create index users_language on users(extract_language(settings));

L'index sera alors (potentiellement) utilisé dans des requêtes telles que:

select * from users where extract_language(settings) = 'en';
3
Denis de Bernardy

J'ai donc eu un problème où le texte était JSON. Si vous avez ce problème, utilisez plutôt cette requête. Où COLUMN est la colonne qui contient le type de données JSONB ou JSON et ATTRIBUTE est l'attribut du JSON qui est une chaîne que vous souhaitez convertir en JSON.

Le texte ressemblera à ceci: "{\" Junk5\": 283774663, \" junk2\": 0, \" junk1\": 1218478497, \" junk3\": 1923, \" junk4\": 63278342} "

SELECT CAST(TRIM(both '"' from jsonstring) as JSON)
FROM (
    SELECT REPLACE(cast(COLUMN->'ATTRIBUTE' as text), '\"', '"')
    as jsonString from TABLE where cast(COLUMN->'ATTRIBUTE' as text)LIKE '%\\%'
) as JSON_CONVERTING
0
Jackstine