Przesyła wiele kolumn do json


23

Korzystam z Postgresql 9.3.4. Mam stół z 3 polami:

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

Muszę przenieść dane do nowej tabeli z polami takimi jak:

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

row_to_jsonnie jest dla mnie rozwiązaniem, ponieważ SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tdodaje również iddo wyniku. Czy istnieje sposób na wybranie potrzebnych pól (nazwa i adres) w polu danych?


Nie jestem pewien, czy odpowiedź jest poprawna. Zapytałem o to 2 lata temu. Odpowiedziałem też wtedy na moje pytanie, ale nie oznaczyłem go jako poprawnego.
AliBZ

Odpowiedzi:


52

W json_build_object()Postgres 9.4+ jest lepsza opcja :

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

Ale row_to_json()w Postgres 9.3 jest także prostszy i szybszy sposób :

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

db <> skrzypce tutaj
Old SQL Fiddle on Postgres 9.6.

Powiązane odpowiedzi:


To lepsza odpowiedź, a skrzypce ma na to dowód.
MIguelele,

5

Znalazłem odpowiedź z tego linku :

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
)

Nie zapomnij zaznaczyć swojej odpowiedzi jako poprawnej (bez punktów :-(). Nie sądzę, że możesz to zrobić od razu, ale może to pomóc komuś, kto ma podobne pytanie w przyszłości.
Vérace

2
Oprócz brakującego aliasu tabeli w zewnętrznym zapytaniu jest to również bardziej złożone i kosztowne niż to konieczne. Dodałem kolejną odpowiedź ze skrzypcami do zademonstrowania.
Erwin Brandstetter,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.