如何从postgres json中仅选择特定的键

时间:2017-12-28 13:59:09

标签: sql json postgresql jsonb

我只需要从postgres json中提取特定的键,让我们考虑以下json

{"aaa":1,"bbb":2,"ccc":3,"ddd":7}

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

{"bbb":2,"ccc":3}

我使用了以下查询,但它正在删除密钥

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

如何只选择指定的按键?

2 个答案:

答案 0 :(得分:3)

您可以明确指定密钥,例如:

var hex = "▄".charCodeAt(0).toString(16);
var result = "\\u" + "0000".substring(0, 4 - hex.length) + hex;

答案 1 :(得分:1)

WITH data AS (
  SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' col
)
SELECT kv.*
FROM data,
LATERAL (
  SELECT jsonb_object(ARRAY_AGG(keyval.key::TEXT), ARRAY_AGG(keyval.value::TEXT)) 
  FROM jsonb_each(col) keyval
  WHERE keyval.key IN ('aaa', 'bbb', 'ccc')) kv

该解决方案的工作原理是扩展JSONB(或JSON)对象,过滤密钥,聚合过滤后的密钥&用于创建最终JSONB(或JSON)对象的值。

但是,此解决方案不保留空值,即如果data有一行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