从JSON数组中提取元素并将它们作为连接字符串返回

时间:2018-03-14 16:20:29

标签: postgresql jsonb postgresql-10 postgresql-json

PostgreSQL 10表包含JSON数据(例如SQL Fiddle):

[
    {
        "col": 7,
        "row": 12,
        "value": 3,
        "letter": "A"
    },
    {
        "col": 8,
        "row": 12,
        "value": 10,
        "letter": "B"
    },
    {
        "col": 9,
        "row": 12,
        "value": 1,
        "letter": "C"
    },
    {
        "col": 10,
        "row": 12,
        "value": 2,
        "letter": "D"
    }
]

如何仅提取“字母”值并将它们连接到类似

的字符串
ABCD

我想最后我应该使用ARRAY_TO_STRING函数,但JSON function用于将“字母”值提取到数组中?

更新

也非常有用的PostgreSQL邮件列表:

SELECT string_agg(x->>'letter','') FROM json_array_elements(

'[{"col": 7, "row": 12, "value": 3, "letter": "A"}, {"col": 8, "row": 12, "value": 10, "letter": "B"}, {"col": 9, "row": 12, "value": 1, "letter": "C"}, {"col": 10, "row": 12, "value": 2, "letter": "D"}]'::json

) x;

1 个答案:

答案 0 :(得分:1)

使用jsonb_array_elements()string_agg():

with my_table(json_data) as (
values(
'[
    {
        "col": 7,
        "row": 12,
        "value": 3,
        "letter": "A"
    },
    {
        "col": 8,
        "row": 12,
        "value": 10,
        "letter": "B"
    },
    {
        "col": 9,
        "row": 12,
        "value": 1,
        "letter": "C"
    },
    {
        "col": 10,
        "row": 12,
        "value": 2,
        "letter": "D"
    }
]'::jsonb)
)
select string_agg(value->>'letter', '')
from my_table
cross join lateral jsonb_array_elements(json_data)

 string_agg 
------------
 ABCD
(1 row)