我在db中有一列,其中包含JSON
个值,例如:
{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}
按喜欢查询。
SELECT column->>'key-1' FROM table;
我可以获得我的val-1
。
是否有一种方法可以从已经存在的value
值中获取key
中的JSON
和 sql
作为JSON
?
我想得到类似这样的结果
{"key-1": "val-1"}
来自
{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}
使用sql查询。
答案 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 ...;