在Postgres中查询对象的JSON数组

克里斯·布拉格

我有一个带有json数据字段的postgres数据库。我拥有的json是一个对象数组:

[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]

我试图返回JSON数组中特定键的值,因此在上面的示例中,我想返回name的值。

当我使用以下查询时,我只会得到一个NULL值:

SELECT data->'name' AS name FROM json_test

我认为这是因为它是一个对象数组?是否可以直接解决名称键?

最终,我需要做的是返回每个唯一名称的计数,这可能吗?

谢谢!

哈里穆尔·阿里(Haleemur Ali)

你必须UNNEST阵列JSON-对象首先使用功能(json_array_elements 或者jsonb_array_elements如果有jsonb数据类型),则可以通过指定键访问的值。

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  y.x->'name' "name"
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

-- outputs:
name
--------------
"Mickey Mouse"
"Donald Duck"

为了获得唯一名称的计数,它与上面的查询类似,不同之处在于: y.x->>name

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  COUNT( DISTINCT y.x->>'name') distinct_names
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

有必要使用->>代替,->因为前者(->>)将提取的值强制转换为文本,以支持相等比较(需要不同的计数),而后者(->)将值提取为json,不支持相等比较。

或者,将jsonas转换jsonbuse jsonb_array_elementsJSONB支持相等比较,因此可以使用COUNT DISTINCT以及通过进行提取->,即

COUNT(DISTINCT (y.x::jsonb)->'name')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章