我有一个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
有人能指出正确的语法是什么吗?
答案 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)