首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在查询中获取裁剪的JSON

在查询中获取裁剪的JSON
EN

Stack Overflow用户
提问于 2019-04-23 10:02:22
回答 2查看 63关注 0票数 0

我在db中有一个列,它对JSON值进行约束,如:

代码语言:javascript
复制
{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}

通过查询比如..。

代码语言:javascript
复制
SELECT column->>'key-1' FROM table;

我可以拿到我的val-1

是否有一种方法可以从已经存在的value值中将 key作为JSONsql查询中获得?

我想得到这样的结果:

代码语言:javascript
复制
{"key-1": "val-1"}

从…

代码语言:javascript
复制
{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}

使用sql查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-23 10:25:52

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

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2019-04-23 11:23:06

使用符号运算符,&,例如,

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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
| j                 |
| ----------------- |
| {"key-1":"val-1"} |

)创建一个函数,提取所需的键值对,然后为它创建自己的用户定义操作符。

代码语言:javascript
复制
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
);            

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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
| j                 |
| ----------------- |
| {"key-1":"val-1"} |

如果要多次从jsonb中提取密钥值对,则需要为其提供一个操作符,例如&。当您想要创建自己的操作符时,Postgres非常灵活,它也可以创建:->>>

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

代码语言:javascript
复制
create operator ->>> (
  leftarg = jsonb,
  rightarg = text, 
  procedure = extract_one_jsonb
);            

输出:

代码语言:javascript
复制
| j                 |
| ----------------- |
| {"key-1":"val-1"} |

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
select d%>'key-1' as j from the_table
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55808733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档