row_to_jsonを使用してJSONを作成するときに属性に名前を設定します


24

一部の列に対してのみ関数をf1, f2, f3...使用する場合、デフォルト名を変更できrow_to_jsonますか?

できます

row_to_json(customers)

帰る

{"id_customer":2,"first_name":"bla","last_name":"second_bla"}

しかし、名前なしid_customerでのみが必要な場合は、使用する必要があります

row_to_json(row(first_name, last_name))

そして、私は得る

{"f1":"bla","f2":"second_bla"}

そして、デフォルトの列名または独自の列名でこの結果を取得したいと思います。独自の複合型を作成して使用できることを知っています

row_to_json(row(first_name, last_name))::my_custom_type

しかし、そのタイプを作成せずにクエリ内で直接行うことはできませんか?


1
また、参照:同様の参照1参照2
MikeM

回答:


17

共通テーブル式を使用すると、CTEだけでなくその列にもエイリアスを明示的に指定できます。

WITH data(col1,col2,cola,colb) AS (
  VALUES (1,2,'fred','bob')
)
SELECT row_to_json(data) FROM data;

これはcol AS aliasSELECTリスト内の各列に対して使用しないという点で、@ dezsoの例とは異なります。CTEテーブルエイリアスの列名をエイリアスします。

私が使用したVALUESサブクエリとして表現したが、使用することができますSELECTあなたが好き。ポイントは、サブクエリで提供されるまたは想定される列エイリアスはすべて、column-name-listを指定することでCTE定義でオーバーライドできることです。

再び使用する代わりに、サブクエリで同じことを行うことができますAS alias

SELECT row_to_json(data) 
FROM (VALUES (1,2,'fred','bob')) data(col1,col2,cola,colb);

これは、ROW式では直接機能しません。をROW具象型にのみキャストでき、別名を付けることはできません。

regress=> SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);
ERROR:  syntax error at or near "("
LINE 1: SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);

ソリューション(使用方法、パフォーマンスなど)に(スタイルや読みやすさ以外に)違いはありますか?
-dezso

@dezsoいいえ、おそらくコメントを投稿するだけでした。ごめんなさい。
クレイグリンガー

これは大丈夫だと思います。私はあなたの答えに賛成でさえも賛成しました。
-dezso

列エイリアスを動的に取得するための構文はありますか?目的のキー名もattribute.name列から選択されているEAV(エンティティ属性値)スキーマから取得しています。
クリス

@Chris 9.4では、より洗練されたjson関数が必要になります。
クレイグリンガー

23
select 
   c.id,
   (select row_to_json(_) from (select c.first_name, c.last_name) as _) as first_last,
   c.age
from
   customers as c

パフォーマンスに影響を与えることなく、必要なことを行います(冗長ではありません):

  id  |   first_last                                |   age
------+---------------------------------------------+---------
  1   | {"fisrt_name": "John", "last_name": "Smit"} |   34

4
この答えは逸品です。
ティフォン

あなたが私の午後を救ってくれたことに感謝します。残念なことに、これはPostgreSQL APIの引用例ではありません。それが可能であることを知っていた
-jlandercy

9

次のようなことができます:

WITH r AS (
  SELECT 'bla' AS name1, 'otherbla' AS name2
)
SELECT row_to_json(r.*)
FROM r
;

(もちろん、同じことは

SELECT row_to_json(r.*)
FROM (SELECT 'bla' AS name1, 'otherbla' AS name2) r
;

前者の方が読みやすいと思いました。)

ではWITH一部あなたはその場で任意の構造の行を構築することができます。


Rとして(SELECT C1、C2 :: us_ca_monterey_aoc.test FROM jsonb)FROM jsonbと非jsonb CONCATENATE :: SELECT row_to_json(R *)へ
アンドリュー・スコット・エヴァンス

9

を使用できますjson_build_object

SELECT 
  json_build_object('id', data.customer_id, 'first_name', data.first_name, 'last_name', data.last_name) as your_json
FROM data;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.