我有這樣的一個表:PostgreSQL的行合併使用相同的密鑰(hstore或JSON)
+--------+--------------------+
| ID | Attribute |
+--------+--------------------+
| 1 |"color" => "red" |
+--------+--------------------+
| 1 |"color" => "green" |
+--------+--------------------+
| 1 |"shape" => "square" |
+--------+--------------------+
| 2 |"color" => "blue" |
+--------+--------------------+
| 2 |"color" => "black" |
+--------+--------------------+
| 2 |"flavor" => "sweat" |
+--------+--------------------+
| 2 |"flavor" => "salty" |
+--------+--------------------+
我要運行一些Postgres的查詢得到的結果表是這樣的:
+--------+------------------------------------------------------+
| ID | Attribute |
+--------+------------------------------------------------------+
| 1 |"color" => "red, green", "shape" => "square" |
+--------+------------------------------------------------------+
| 2 |"color" => "blue, black", "flavor" => "sweat, salty" |
+--------+------------------------------------------------------+
屬性列可以是hstore或json格式。我在hstore中爲它編寫了一個例子,但如果我們無法在hstore中實現這一點,但在json中,我會將該列更改爲json。
我知道hstore不支持多個值的一個鍵,當我嘗試一些合併方法時,它只爲每個鍵保留一個值。但是對於json,我沒有發現任何支持多值合併的東西。我認爲這可以通過將同一個鍵的值合併爲一個字符串/文本並將其添加回鍵/值對來完成。但我堅持實施它。
注意:如果在某些功能中實現此功能,理想情況下功能中不應出現任何顏色,形狀等鍵,因爲鍵可以動態擴展。
有沒有人有這方面的想法?任何建議或頭腦風暴都可能有所幫助。謝謝!
非常感謝您的快速回復。我無法將我的postgres升級到9。4來測試它昨天(json_to_record()需要9.4)。有很多員工需要在postgres中學習。我查找了PAR_table,它看起來像表名的文本表示,並且類似地,PAR_where_clause是where子句的文本。但是我還沒有找到解釋它如何工作的定義或者它的定義,和regclass一樣。您能否介紹一下這些內容,或者提供一些我可以閱讀的來源或文章? – icebox
另外,正如我在文章中提到的,屬性列是以hstore格式編寫的,它看起來像json。 – icebox
爲了防止任何SQL注入或不良行爲PAR_table被作爲類型[regclass](http://www.postgresql.org/docs/current/static/datatype-oid.html)傳遞給函數,並通過[ format()](http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-FORMAT)函數。關於hstore,如果你使用9.4,我建議你使用[jsonb](http://www.postgresql.org/docs/current/static/datatype-json.html)數據類型,它有很多好處。你在你的問題中說過改變數據類型是一個選項。 9.4,我認爲這是你能做的最好的。 – Eggplant