Czy można zmienić nazwy domyślne f1, f2, f3...
przy użyciu row_to_json
funkcji tylko dla niektórych kolumn?
potrafię
row_to_json(customers)
powracający
{"id_customer":2,"first_name":"bla","last_name":"second_bla"}
Ale jeśli chcę tylko nazwy bez id_customer
, muszę użyć
row_to_json(row(first_name, last_name))
a potem dostaję
{"f1":"bla","f2":"second_bla"}
Chciałbym uzyskać ten wynik z domyślnymi nazwami kolumn lub własnymi. Wiem, że mogę stworzyć własny typ kompozytu i użyć go
row_to_json(row(first_name, last_name))::my_custom_type
ale czy nie można tego zrobić poprawnie w zapytaniu bez utworzenia tego typu?
postgresql
boobiq
źródło
źródło
Odpowiedzi:
Wspólne wyrażenie tabelowe pozwala jawnie określać aliasy, nie tylko dla CTE, ale dla jego kolumn.
Różni się to od przykładu @ dezso, ponieważ nie stosuje się go
col AS alias
dla każdej kolumny naSELECT
liście; aliasuje nazwy kolumn w aliasie tabeli CTE.Użyłem
VALUES
wyrażenia jako podzapytania, ale możesz użyćSELECT
dowolnego, co chcesz; Chodzi o to, że wszelkie aliasy kolumn, które są udostępniane lub zakładane w podzapytaniu, można zastąpić w definicji CTE, określając listę nazw kolumn.Możesz zrobić to samo w podzapytaniu, ponownie zamiast używać
AS alias
:To nie działa
ROW
bezpośrednio z wyrażeniem; możesz rzucić tylkoROW
na konkretny typ, nie możesz go aliasować.źródło
zrobi co chcesz bez wpływu na wydajność (i nie jest zbyt gadatliwy):
źródło
Możesz zrobić coś takiego:
(Oczywiście to samo można osiągnąć za pomocą
ale ten pierwszy był bardziej czytelny).
W
WITH
części możesz budować w locie rzędy dowolnej struktury.źródło
Możesz użyć
json_build_object
.źródło