简体   繁体   English

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

[英]How to query JSON column for unique object values in PostgreSQL

I'm looking to query a table for a distinct list of values in a given JSON column.我正在寻找在给定 JSON 列中查询不同值列表的表。

In the code snippet below, the Survey_Results table has 3 columns: Name, Email, and Payload.在下面的代码片段中,Survey_Results 表有 3 列:名称、电子邮件和有效负载。 Payload is the JSON object to I want to query. 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"}
                                      ]

I am looking for a unique list of all fieldNames mentioned.我正在寻找提到的所有 fieldNames 的唯一列表。

The ideal answer would be query giving me a list containing "Product Name", "Product Price", "Food Name", "Food Taste", "Band Name", and "Valid Member".理想的答案是查询给我一个包含“产品名称”、“产品价格”、“食物名称”、“食物味道”、“乐队名称”和“有效会员”的列表。

Is something like this possible in Postgres?在 Postgres 中可能有这样的事情吗?

Use jsonb_array_elements() in a lateral join:在横向连接中使用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)    

How to find distinct Food Name values?如何找到不同的食品名称值?

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. 数据库<>小提琴。

Important.重要的。 Note that the json structure is illogical and thus unnecessarily large and complex.请注意,json 结构是不合逻辑的,因此不必要地庞大和复杂。 Instead of代替

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

use

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

Open this db<>fiddle to see that proper json structure implies simpler and faster queries.打开这个db<>fiddle可以看到正确的 json 结构意味着更简单和更快的查询。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM