在查询中获取切断的JSON

时间:2019-04-23 10:02:23

标签: postgresql

我在db中有一列,其中包含JSON个值,例如:

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

按喜欢查询。

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

我可以获得我的val-1

是否有一种方法可以从已经存在的value值中获取key中的JSONsql作为JSON

我想得到类似这样的结果

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

来自

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

使用sql查询。

2 个答案:

答案 0 :(得分:3)

使用与号运算符&,例如

实时测试: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

答案 1 :(得分:2)

我唯一想到的就是获取键/值对并将其组合回单个JSON值:

select jsonb_build_object(j.k, j.v)
from the_table t, jsonb_each(t.json_col) as j(k,v)
where j.k = 'key-1'
  and ... more conditions ...;

在线示例:https://rextester.com/VGSX43955