我只需要从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}'
如何只选择指定的按键?
答案 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