Postgres plusieurs colonnes à json


23

J'utilise postgresql 9.3.4. J'ai une table avec 3 champs:

id   name  addr
---  ----  ----
1    n1    ad1
2    n2    ad2
...

J'ai besoin de déplacer les données vers une nouvelle table avec des champs comme:

id   data
---  ----
1    {'name': 'n1', 'addr': 'ad1'}
2    {'name': 'n2', 'addr': 'ad2'}
...

row_to_jsonn'est pas la solution pour moi, car cela SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tajoute également idau résultat. Existe-t-il un moyen de choisir les champs dont j'ai besoin (nom et adresse) dans mon champ de données?


Je ne sais pas si la réponse est correcte. Je l'ai posé il y a 2 ans. J'ai également répondu à ma question à l'époque, mais je ne l'ai pas marquée comme correcte.
AliBZ

Réponses:


52

Il existe une meilleure option avec json_build_object()Postgres 9.4+ :

SELECT id, json_build_object('name', name, 'addr', addr) AS data
FROM   myt;

Mais il existe également un moyen plus simple et plus rapide avec row_to_json()Postgres 9.3 :

SELECT id, row_to_json((SELECT d FROM (SELECT name, addr) d)) AS data
FROM   myt;

db <> fiddle here
Ancien SQL Fiddle sur Postgres 9.6.

Réponses associées:


C'est une meilleure réponse, et le violon en a la preuve.
MIguelele

5

J'ai trouvé la réponse de ce lien :

select * from (
  select id,
    (
      select row_to_json(d)
      from (
        select name, addr
        from myt d
        where d.id=s.id
      ) d
    ) as data
  from myt s
)

N'oubliez pas de marquer votre propre réponse comme correcte (pas de points cependant :-(). Je ne pense pas que vous puissiez le faire immédiatement, mais cela pourrait aider quelqu'un avec une question similaire à l'avenir.
Vérace

2
Mis à part l'alias de table manquant dans la requête externe, cela est également plus complexe et coûteux que nécessaire. J'ai ajouté une autre réponse avec un violon pour démontrer.
Erwin Brandstetter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.