postgresql - 在查询中获取截断的 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
查询?JSON
sql
JSON
我想得到如下结果:
{"key-1": "val-1"}
从
{"key-1": "val-1", "key-2": "val-2", "key-3": "val-3"}
使用 sql 查询。
解决方案
使用 & 运算符&
,例如,
现场测试: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
推荐阅读
- post - 如何在继续使用 HttpWebRequest 发布数据的同时检查 HTTP 响应
- java - Criteria Api Vs QueryDsl Vs JPA 元模型
- postgresql - 选择没有价值的记录
- jquery - 复选框字段“重置”功能,更改时取消选中,直到再次选中
- html - 从具有嵌入阴影的文本开始,当我将鼠标悬停在每个字母上时,如何为每个字母进行颜色转换?仅使用 CSS 和 HTML
- java - 如何将 JButton 添加到 JFrame?
- ios - 模拟器中没有 Touch ID / Face ID 提示
- azure - 尝试从 Azure WebJob 写入文件
- java - Android WebView - 2018 年的文本选择侦听器
- c# - Xamarin.Forms C# 属性未在 Device.StartTimer 中更新