2014-06-25 3 views
1

저는 postgres 9.2를 사용하고 있습니다. 특정 형식의 json을 생성하는 쿼리를 생성하려고합니다. 나는 단순한 json_agg 표현식에 꽤 가깝지만 지금은 앞으로 나아갈 것입니다. json dict 키로 json을 생성합니다.

내가 간단한 3 테이블 스키마를 가지고 정의는 다음과 같습니다 내가 반환하는 쿼리를 구성하고 싶습니다

INSERT INTO project (id, name) VALUES (0, 'my_project'); 
INSERT INTO test (id, name, project_id) VALUES (0, 'test0', 0); 
INSERT INTO data (date_entered, data, test_id) VALUES (TIMESTAMP WITH TIME ZONE '2014-04-15T09:34:41.454999 z', '["some", "data"]', 0); 
INSERT INTO test (id, name, project_id) VALUES (1, 'test1', 0); 
INSERT INTO data (date_entered, data, test_id) VALUES (TIMESTAMP WITH TIME ZONE '2014-04-15T09:34:41.454999 z', '["some", "data"]', 1); 

:

CREATE TABLE project (
    id  INTEGER PRIMARY KEY, 
    name varchar(128) NOT NULL, 
    UNIQUE (name)  
); 

CREATE TABLE test (
    id   INTEGER PRIMARY KEY, 
    name  varchar(128) NOT NULL, 
    project_id integer, 
    FOREIGN KEY (project_id) REFERENCES project(id), 
); 

CREATE TABLE data (
    id    INTEGER PRIMARY KEY, 
    date_entered timestamp with time zone NOT NULL, 
    data   json NOT NULL, 
    test_id   integer, 
    FOREIGN KEY (test_id) REFERENCES test(id) 
); 

과 같이 일부 데이터를 삽입 한 후

{ 
    "test0": { 
    "first_data": "2014-04-15 09:35:10.394+00", 
    "data_points": 1 
    }, 
    "test1": { 
    "first_data": "2014-04-15 09:35:10.394+00", 
    "data_points": 1 
    } 
} 

가장 가까운 해결책은 다음과 같습니다.

이 반환 6,
SELECT 
    json_agg(data) as data 
FROM (
    SELECT 
     test.name as test_name, 
     min(data.date_entered) as first_data, 
     count(data.id) as data_points 
    FROM test 
    INNER JOIN data on data.test_id = test.id 
    INNER JOIN project on test.project_id = project.id 
    WHERE project.name = 'my_project' 
    GROUP BY test.name 
) as data; 

:

[ 
    { 
    "test_name":"test0", 
    "first_data":"2014-04-15 09:34:41.454999+00", 
    "data_points":1 
    }, 
    { 
    "test_name":"test1", 
    "first_data":"2014-04-15 09:34:41.454999+00", 
    "data_points":1 
    } 
] 

내가 row_to_json 및 array_to_json의 다양한 홀수 사용을 시도했습니다,하지만 외부 사전에 열쇠가 될하기 위해 test_name 값을 이동할 수없는 것.

이것도 가능합니까? Postgres의 json 생성 함수를 남용하고 있습니까?

+0

http://stackoverflow.com/questions/19378523/postgres-9-3-json-output-multi-dimensional-object – Fabricator

+0

@Fabricator - 그 대답은 못생긴 문자열 연결을 사용합니다. 다른 방법이 없습니까? 그게 최고의 포스트 그레스가 할 수있는 경우 내 응용 프로그램에서 대신 할거야 ... – Thomi

+0

미안해, 나는 모른다. – Fabricator

답변

0

응용 프로그램 언어로 실제로 더 잘 수행 할 수 있습니다. 즉 여기 미루어 것은 못생긴 문자열 연결 솔루션에게 있습니다

SQL Fiddle

select 
    (format(
     '{"%s": {"first_data": "%s", "data_points": %s}}', 
     test.name, 
     min(data.date_entered), 
     count(data.id) 
    ))::json as data 
from test 
inner join data on data.test_id = test.id 
inner join project on test.project_id = project.id 
where project.name = 'my_project' 
group by test.name 
관련 문제