我在雅典娜有一个嵌套的json

 { "template": {"name":"User Name", "id": 10001}} 

Output :- {"name":"User Name", "id": 10001}

我try 从内部json中提取id到目前为止,我已经try 了json提取和json提取标量,但两者都不适用于嵌套的JSON

有了这个,我们就可以访问模板json

JSON_EXTRACT(db.column_name, '$.template') AS template

我正在try 嵌套的json来访问id字段,但它无法访问

json_extract_scalar(json_extract(db.column_name, '$.template'), '$.id') as id
json_extract(json_extract(db.column_name, '$.template'), '$.id') as id

推荐答案

Tbh您的两次try 对我都有效,但通常您应该能够通过提供完整路径访问它(不需要嵌套提取):

-- sample data
with dataset(json_col) as(
    values ('{ "template": {"name":"User Name", "id": 10001}}' )
)

-- query
select json_extract_scalar(json_col, '$.template.id') id
from dataset;

输出:

  id
-------
 10001
(1 row)

您可能有一些错误的行,因此您可以使用try,它将在出现错误时返回NULL:

-- query
select try(json_extract_scalar(json_col, '$.template.id')) id
from dataset;

UPD

实际的问题是template包含一个字符串,而不是一个嵌套的JSON对象(字符串的内容实际上是编码的JSON).您需要再次解析JSON-try 在内部使用json_extract_scalar(json_extract_scalar将返回varchar字符串,外部将再次解析):

-- sample data
with dataset(json_col) as(
    values ('{ "template": "{\"project_id\": 1736024, \"sender_name\": \"something\"}"}' )
)

-- query
select json_extract_scalar(json_extract_scalar(json_col, '$.template'), '$.project_id') id
from dataset;
  id
-------
 1736024
(1 row)

Sql相关问答推荐

使用自动增量ID插入失败(无法将值空插入列ID)

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

如何在一个范围内进行分组.""范围值在范围表中定义

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

基于多个字段删除Access中的重复记录,同时保留最低优先级

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

将结果从一列转换为两行或更多

IF NOT EXISTS子查询的性能瓶颈

在xml.Modify方法中使用子字符串和可能的替代方法

在UNION查询中查找MIN

在 PostgreSQL 中使用 ltree 列进行累积

不同计数的 Postgres PIVOT 表

没有调用子查询的嵌套 JOIN语法是什么?

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

复制SQL Server临时表

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

来自 SQL Server 的树层次 struct 图的 JSON

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数

为什么这是 AND,OR with NULL 的真值表?

REGEXP 用于字符串格式化以对用空格分隔的字符和数字进行分组