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.