Postgresql:将jsonb数组列中的值显示为CSV

时间:2015-12-05 15:14:12

标签: arrays json postgresql csv jsonb

我有一个jsonb列,用于存储值数组:

["value1", "value2", "value3"]

我想将该数组中的值与另一列的值连接起来,例如而不是:

string column | jsonb column
--------------+-------------------------------
   mystring   | ["value1", "value2", "value3"]

我可以:

           string + jsonb
------------------------------------
   mystring, value1, value2, value3

我天真地尝试使用jsonb_array_elements无济于事。

SELECT string_column || ', ' || jsonbvalues
FROM mytable, jsonb_array_elements(mytable.jsonb_column) as jsonbvalues

有人能指出正确的语法是什么吗?

1 个答案:

答案 0 :(得分:0)

函数json_array_elements()返回set,因此您需要一个聚合函数。 如果分组的列是唯一的,则聚合将是正确的。

以下查询假定string_column是唯一的。

SELECT format('%s, %s', string_column, string_agg(jsonbvalues, ', ')) result
FROM (
    SELECT string_column, jsonbvalues
    FROM mytable, jsonb_array_elements_text(mytable.jsonb_column) as jsonbvalues
    ) sub
GROUP BY string_column;

              result              
----------------------------------
 mystring, value1, value2, value3
(1 row)

如果string_column不是唯一的,例如:

SELECT * FROM mytable;

 string_column |          jsonb_column          
---------------+--------------------------------
 mystring      | ["value1", "value2", "value3"]
 mystring      | ["value4", "value5", "value6"]
(2 rows)

您可以使用row_number()来识别原始行:

SELECT format('%s, %s', string_column, string_agg(jsonbvalues, ', ')) result
FROM (
    SELECT rn, string_column, jsonbvalues
    FROM (
        SELECT *, row_number() over () as rn
        FROM mytable
        ) t, 
        jsonb_array_elements_text(jsonb_column) as jsonbvalues
    ) sub
GROUP BY rn, string_column;

              result              
----------------------------------
 mystring, value1, value2, value3
 mystring, value4, value5, value6
(2 rows)