首页 > 解决方案 > 在查询中获取截断的 JSON

问题描述

我在 db 中有一个列,其中JSON包含以下值:

{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}

通过查询像..

SELECT column->>'key-1' FROM table;

我可以得到我的val-1.

有没有办法从已经存在的值中value 获取 key查询?JSONsqlJSON

我想得到如下结果:

{"key-1": "val-1"}

{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}

使用 sql 查询。

标签: postgresql

解决方案


使用 & 运算符&,例如,

现场测试:https ://www.db-fiddle.com/f/9izCEH75JhwVDvsGvsZomG/0

with the_table as
(
    select '{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}'::jsonb as d
)
select d & 'key-1' as j from the_table

输出:

| j                 |
| ----------------- |
| {"key-1":"val-1"} |

开个玩笑 :) 创建一个提取所需键值对的函数,然后为它创建您自己的用户定义运算符。

create or replace function extract_one_jsonb(j jsonb, key text)
returns jsonb
as
$$ 
    select jsonb_build_object(key, j->key)
$$ language sql;



create operator & (
  leftarg = jsonb,
  rightarg = text, 
  procedure = extract_one_jsonb
);            

当然,您可以只使用一个函数,或者如果创建用户定义的运算符不是一个选项:

with the_table as
(
    select '{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}'::jsonb as d
)
select extract_one_jsonb(d, 'key-1') as j from the_table

输出:

| j                 |
| ----------------- |
| {"key-1":"val-1"} |

如果多次从 jsonb 中提取键值对,最好为其提供一个运算符,例如&. 当您想创建自己的运算符时,Postgres 非常灵活,也可以创建:->>>.

现场测试:https ://www.db-fiddle.com/f/9izCEH75JhwVDvsGvsZomG/1

create operator ->>> (
  leftarg = jsonb,
  rightarg = text, 
  procedure = extract_one_jsonb
);            

输出:

| j                 |
| ----------------- |
| {"key-1":"val-1"} |

->>Postgres 已使用:https ://www.postgresql.org/docs/11/functions-json.html

您可以'->>>'改为创建。->>>看起来更像是一个提取运算符而不是 & 符号&。此外,即使您将其粘贴到源字段(即没有空格),它看起来也不错

with the_table as
(
    select '{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}'::jsonb as d
)
select d->>>'key-1' as j from the_table

尝试了以下,它也可以,看起来像剪刀(用于切割):%>

select d%>'key-1' as j from the_table

推荐阅读