我有一个带有json数据字段的postgres db.

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

我想在上面的示例中返回一个特定于JSON的值.

使用以下查询时,只返回一个空值:

SELECT data->'name' AS name FROM json_test

我猜这是因为它是一个对象数组?是否可以直接寻址名称密钥?

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

谢谢

推荐答案

您必须首先使用函数(json_array_elements or 101 if you have jsonb data type)访问json对象数组,然后可以通过指定键来访问这些值.

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"

要获得唯一名称的计数,它与上面的查询类似,只是count distinct aggregate函数应用于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,不支持相等比较.

或者,将json转换为jsonb,并使用jsonb_array_elements.JSONB支持相等比较,因此可以通过->使用COUNT DISTINCT和提取,即.

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

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

Keycloak和PostgreSQL

在Docker容器内的Postgres,如何通过Promail将JSON登录到Loki?

如何在PostgreSQL中以行值的形式获取列

如何在 postgres 中查询键设置为空值的 jsonb 字段

PostgreSQL TIMESTAMPTZ 不适用于 SpringBoot Java Query

PostgreSQL 查询到 Excel 表

如何为 JavaEE 应用程序中的 PostgreSQL 热备设置配置连接故障转移?

如何在 psycopg2 中使用服务器端游标

SQL Select 一列中具有重复值的所有行

如何在数据库表中查找重复条目?

SQL:多次重复结果行,并对行进行编号

如何缩小 pg_toast 表?

Postgresql 中的 NOT EXISTS 子句

Entity Framework Core jsonb 列类型

如何为 postgres 编写 DELETE CASCADE?

使用 Spring、Hibernate 和 C3P0 管理多租户 Web 应用程序中的连接池

IF处或附近的 Postgres 语法错误

postgresql中的移动平均线

postgresql DB中唯一键的正确数据类型是什么?