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 alias각 열에 대해 사용하지 않는다는 점에서 @dezso의 예와 다릅니다 SELECT. CTE 테이블 별명에서 열 이름의 별명을 지정합니다.

내가 사용한 VALUES서브 쿼리로 표현하지만, 당신이 사용할 수있는 SELECT당신이 원하는대로; 요점은 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 아니요, 아마도 의견을 게시했을 것입니다. 죄송합니다.
Craig Ringer

나는 이것이 정상이라고 생각한다. 나는 심지어 당신의 대답 b / c를 upvoted 그것은 내 것이 아닌 유용한 정보가 포함되어 있습니다.
dezso

열 별칭을 동적으로 가져 오는 구문이 있습니까? 원하는 키 이름이 attribute.name 열에서 선택되는 EAV (엔티티 속성 값) 스키마를 가져옵니다.
Chris

@Chris 9.4에서 더 정교한 json 함수가 필요합니다.
Craig Ringer

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
이 답변은 보석입니다.
tiffon

고맙습니다. 오후 내내 많은 시간을 절약했으며, 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부분 에서는 모든 구조의 행을 즉석에서 구성 할 수 있습니다.


jsonb와 비 jsonb를 연결하려면 :: SELECT row_to_json (r. *) FROM (SELECT c1, c2 :: jsonb FROM us_ca_monterey_aoc.test) as r
Andrew Scott Evans

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.