Postgres mehrere Spalten zu json


23

Ich lasse postgresql 9.3.4 laufen. Ich habe eine Tabelle mit 3 Feldern:

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

Ich muss die Daten in eine neue Tabelle mit folgenden Feldern verschieben:

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

row_to_jsonist nicht die Lösung für mich , da SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tfügt idauch auf das Ergebnis. Gibt es eine Möglichkeit, die benötigten Felder (Name & Adresse) in meinem Datenfeld auszuwählen?


Ich bin nicht sicher, ob die Antwort richtig ist. Ich habe es vor 2 Jahren gefragt. Ich habe meine Frage damals auch beantwortet, sie aber nicht als richtig markiert.
AliBZ

Antworten:


51

json_build_object()In Postgres 9.4+ gibt es eine bessere Option :

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

Aber es gibt auch einen einfacheren und schnelleren Weg mit row_to_json()Postgres 9.3 :

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

db <> hier fummeln
Old SQL Fiddle auf Postgres 9.6.

Verwandte Antworten:


Dies ist eine bessere Antwort, und die Geige hat den Beweis.
Miguelele

5

Ich habe die Antwort über diesen Link gefunden :

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
)

Vergessen Sie nicht, Ihre eigene Antwort als richtig zu markieren (aber keine Punkte :-(). Ich glaube nicht, dass Sie dies sofort tun können, aber es könnte jemandem helfen, der in Zukunft eine ähnliche Frage hat.
Vérace

2
Abgesehen von dem fehlenden Tabellenalias in der äußeren Abfrage ist dies auch komplexer und teurer als nötig. Ich fügte eine andere Antwort mit einer Geige hinzu, um zu demonstrieren.
Erwin Brandstetter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.