0

このような列を持つクエリがあります...

systemid | created | updated

システム ID ごとに、次のようなテーブルに名前と値のペアの任意のセットがあります。

systemid | name | value

したがって、このテーブルには

1,'name','ben'
1,'age',42
2,'name','john'
2,'age',22
2,'favoritecolor','red'

名前と値のペアの型として systemid のすべての名前と値のペアをクエリで返す方法を知っている人はいますか? このような結果を得たいと思います。

systemid | created | updated | profiledata

1,'name','ben','jan 1, 2012, 'name=>\'ben\',age=42'
2,'name','john','sept 15, 2011, 'name=>\'john\',age=22, favoritecolor=>\'red\''
4

2 に答える 2

1

これらの行に沿って何かを試すことができると思います:

postgres=# CREATE TABLE attr(systemid int, name varchar(32), value varchar(64));
CREATE TABLE
postgres=#
postgres=# INSERT INTO attr VALUES(1,'name','ben');
INSERT 0 1
postgres=# INSERT INTO attr VALUES(1,'age', '42');
INSERT 0 1
postgres=# INSERT INTO attr VALUES(2,'name','john');
INSERT 0 1
postgres=# INSERT INTO attr VALUES(2,'age', '22');
INSERT 0 1
postgres=# INSERT INTO attr VALUES(2,'favoritecolor','red');
INSERT 0 1
postgres=#
postgres=# SELECT systemid
postgres-#       ,array_agg( name || '=' || value) AS profile_data
postgres-#   FROM attr
postgres-#   GROUP BY systemid;
 systemid |             profile_data
----------+--------------------------------------
        1 | {name=ben,age=42}
        2 | {name=john,age=22,favoritecolor=red}
(2 rows)

または、hstore または json データ型を調べることができます。

于 2013-01-22T00:26:04.877 に答える
0

これに対する解決策は、大まかに次のいずれかの形式になります。

SELECT table1.systemid,
       created,
       updated,
       some_aggregate_function(name, value) AS profiledata
FROM table1 JOIN table2 ON table1.systemid = table2.systemid
GROUP BY table1.systemid, created, updated

また

SELECT table1.systemid,
       created,
       updated,
       some_aggregate_function(some_function(name, value)) AS profiledata
FROM table1 JOIN table2 ON table1.systemid = table2.systemid
GROUP BY table1.systemid, created, updated

これは、名前と値のペアを持つ JSON オブジェクトを 4 番目の列として返す、2 番目のアプローチのかなりハックで醜い例です。

SELECT table1.systemid, 
       created,
       updated, 
       '{' || array_to_string(
         array_agg(
           '"' || name || '":"' || value || '"'
         ), ','
       ) || '}' AS profiledata
FROM table1
JOIN table2 
ON table1.systemid = table2.systemid
GROUP BY table1.systemid, created, updated;

同じ結果を達成するためにもっときれいなものが必要な場合は、独自の集計関数の定義を検討することをお勧めします。残念ながら、私は SQL の達人ではないので、頭のてっぺんから素敵でエレガントなソリューションを思いつくことはできませんが、うまくいけば、これがあなたを正しい軌道に乗せることを願っています。

于 2013-01-22T00:34:43.987 に答える