如何在PostgreSQL中查询JSON列的唯一对象值

3

我想查询一个表中给定JSON列中唯一值的列表。

在下面的代码片段中,Survey_Results表有3列:Name,Email和Payload。 Payload是我想要查询的JSON对象。

Table Name: Survey_Results

Name         Email                      Payload

Ying         SmartStuff@gmail.com     [
                                      {"fieldName":"Product Name", "Value":"Calculator"},
                                      {"fieldName":"Product Price", "Value":"$54.99"}
                                      ]

Kendrick     MrTexas@gmail.com        [
                                      {"fieldName":"Food Name", "Value":"Texas Toast"},
                                      {"fieldName":"Food Taste", "Value":"Delicious"}
                                      ]

Andy         WhereTheBass@gmail.com   [
                                      {"fieldName":"Band Name", "Value":"MetalHeads"}
                                      {"fieldName":"Valid Member", "Value":"TRUE"}
                                      ]

我正在寻找一个独特的字段名称列表。理想的答案应该是一个查询,给我一个包含"Product Name"、"Product Price"、"Food Name"、"Food Taste"、"Band Name"和"Valid Member"的列表。在Postgres中是否有类似的功能?
1个回答

5

使用 jsonb_array_elements() 进行侧向连接:

select distinct value->>'fieldName' as field_name
from survey_results
cross join json_array_elements(payload)

  field_name   
---------------
 Product Name
 Valid Member
 Food Taste
 Product Price
 Food Name
 Band Name
(6 rows)    

如何查找不同的食品名称值?
select distinct value->>'Value' as food_name
from survey_results
cross join json_array_elements(payload)
where value->>'fieldName' = 'Food Name'

  food_name  
-------------
 Texas Toast
(1 row)

Db<>fiddle.

重要提示。请注意,json结构不合逻辑,因此过于庞大和复杂。建议改为

[
    {"fieldName":"Product Name", "Value":"Calculator"},
    {"fieldName":"Product Price", "Value":"$54.99"}
]

使用

{"Product Name": "Calculator", "Product Price": "$54.99"}

打开这个db<>fiddle,可以看到正确的JSON结构意味着更简单和更快速的查询。

如何查找不同的食品名称值? - Pranay Soni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接