Sql 如何仅从postgres json中选择特定键 我只需要从PoxGRESJSON中提取特定的键,让我们考虑下面的JSON/P> {"aaa":1,"bbb":2,"ccc":3,"ddd":7}

Sql 如何仅从postgres json中选择特定键 我只需要从PoxGRESJSON中提取特定的键,让我们考虑下面的JSON/P> {"aaa":1,"bbb":2,"ccc":3,"ddd":7},sql,json,postgresql,jsonb,Sql,Json,Postgresql,Jsonb,从上面的json中,我需要选择键“bbb”和“ccc”,即 {"bbb":2,"ccc":3} 我使用了以下查询,但它正在删除密钥 SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}' 如何仅选择指定的键?您可以明确指定键,如下所示: t=# with c(j) as (SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}') select j,jsonb_build_o

从上面的json中,我需要选择键“bbb”和“ccc”,即

{"bbb":2,"ccc":3}
我使用了以下查询,但它正在删除密钥

SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}'

如何仅选择指定的键?

您可以明确指定键,如下所示:

t=# with c(j) as (SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}')
select j,jsonb_build_object('aaa',j->'aaa','bbb',j->'bbb') from c;
                    j                     |  jsonb_build_object
------------------------------------------+----------------------
 {"aaa": 1, "bbb": 2, "ccc": 3, "ddd": 7} | {"aaa": 1, "bbb": 2}
(1 row)
该解决方案通过扩展
JSONB
(或
JSON
)对象、过滤键、聚合过滤后的键和值来创建最终的
JSONB
(或
JSON
)对象

但是,此解决方案不保留空值,即如果
数据
有一行
col
有值
jsonb'{“aaa”:1,“bbb”:2,“ddd”:7}'
,则上述解决方案将返回
jsonb'{“aaa”:1,“bbb”:2}'

要保留空值,可以使用以下形式

WITH data AS (
  SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' col
), keys(k) AS (
  VALUES ('aaa'), ('bbb'), ('ccc')
)
SELECT col, jsonb_object(ARRAY_AGG(k), ARRAY_AGG(col->>k))
FROM data, keys 
GROUP BY 1

您需要将结果作为json/jsonb还是提取到单独的列中?我需要json/jsonb作为结果而不是值
WITH data AS (
  SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' col
), keys(k) AS (
  VALUES ('aaa'), ('bbb'), ('ccc')
)
SELECT col, jsonb_object(ARRAY_AGG(k), ARRAY_AGG(col->>k))
FROM data, keys 
GROUP BY 1