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.