我正在尝试在 PostgreSQL 9.4 中搜索 JSONB 对象。我的问题类似于这个线程。
但是,我的数据结构略有不同,这导致了我的问题。我的数据结构是这样的:
[
{"id":1, "msg":"testing"}
{"id":2, "msg":"tested"}
{"id":3, "msg":"nothing"}
]
Run Code Online (Sandbox Code Playgroud)
我想通过 msg(RegEx、LIKE、= 等)在该数组中搜索匹配的对象。更具体地说,我希望表中 JSONB 字段具有与我的请求匹配的“msg”对象的所有行。
下面显示了一个类似于我所拥有的结构:
SELECT * FROM
(SELECT
'[{"id":1,"msg":"testing"},{"id":2,"msg":"tested"},{"id":3,"msg":"nothing"}]'::jsonb as data)
as jsonbexample;
Run Code Online (Sandbox Code Playgroud)
这显示了尝试实现上述链接的答案,但不起作用(返回 0 行):
SELECT * FROM
(SELECT
'[{"id":1,"msg":"testing"},{"id":2,"msg":"tested"},{"id":3,"msg":"nothing"}]'::jsonb as data)
as jsonbexample
WHERE
(data #>> '{msg}') LIKE '%est%';
Run Code Online (Sandbox Code Playgroud)
谁能解释如何搜索 JSONB 数组?在上面的示例中,我想在表中查找“data”JSONB 字段包含“msg”匹配某些内容的对象的任何行(例如,LIKE '%est%')。
此代码创建了一个新类型(稍后需要):
CREATE TYPE AlertLine AS (id INTEGER, msg TEXT);
Run Code Online (Sandbox Code Playgroud)
然后你可以用它来撕开带有 JSONB_POPULATE_RECORDSET 的列:
SELECT * FROM
JSONB_POPULATE_RECORDSET(
null::AlertLine,
(SELECT '[{"id":1,"msg":"testing"},
{"id":2,"msg":"tested"},
{"id":3,"msg":"nothing"}]'::jsonb
as data
) …Run Code Online (Sandbox Code Playgroud) 我有一个jsonb列,其数据如下.
[
{"key": "unit_type", "value": "Tablet", "display_name": "Unit Type"},
{"key": "pack_type", "value": "Packet", "display_name": "Pack Type"},
{"key": "units_in_pack", "value": "60", "display_name": "Units in Pack"},
{"key": "item_unit", "value": "", "display_name": "Item unit"},
{"key": "item_size", "value": "1", "display_name": "Item Size"},
{"key": "details", "value": "", "display_name": "Details"},
{"key": "slug", "value": "otc7087", "display_name": "Slug"}
]
Run Code Online (Sandbox Code Playgroud)
我想value从具有key被调用的数组中获取字段slug,这样当我对表执行select查询时,我从列中获取此特定值.对于上面这行select name, slug, price from table,我应该得到med1, otc7087, 100输出.我无法为此事构建查询.我可以获取所有键或所有值,但如何在同一个选择查询中选择特定键?
或者我只是如何slugs从表中选择?那会回答.
我想将数据从一列 (varchar) 迁移到另一列 (jsonb)
Column | Type | Modifiers
------------+-----------------------------+--------------------------------------------------------
id | integer | not null default nextval('merchants_id_seq'::regclass)
name | character varying | not null
nameb | jsonb | not null default '{}'::jsonb
Run Code Online (Sandbox Code Playgroud)
所以这nameb将成为{"en": "$name"}其中$name的一个值name字段。
例如:
选择名称,名称 b
前:
name | nameb
--------------------------------------+------------
hello | {}
world | {}
Run Code Online (Sandbox Code Playgroud)
后:
name | nameb
--------------------------------------+------------
hello | {"en": "hello"}
world | {"en": "world"}
Run Code Online (Sandbox Code Playgroud)
使用常规类型我可以做到UPDATE SET whatever = (SELECT ...),但是如何使用 jsonb 做到这一点? …
我正在访问一个jsonb字段中的数组(一个名为“choice_values”的 json 对象),并希望将其内容解析为逗号分隔的文本字段。
SELECT
jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values')
FROM
field_data.exports;
Run Code Online (Sandbox Code Playgroud)
该 jsonb_array_elements 函数返回一个“文本集”,我想将其转换为包含在单个字段中的逗号分隔的数组值列表。
谢谢你。
给定一组数据。
1 | { 'completed': true }
2 | { 'office_completed': false }
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以查询office_completed != 'true'并返回两条记录?还是选择所有没有office_completed键的记录的方法?我可以使用以下命令查询所有具有office_completed键的记录:
SELECT * FROM jsonb WHERE data ? 'office_completed';
但是找不到相反的方法。
导致我遇到这个问题的原因是,我有一个可能有或没有office_completed键的数据集,我需要查询所有具有office_completed != 'true'键的记录,但是如果键不存在,那么我将一无所获。如果密钥不存在,我认为那应该算是,!=true但显然不存在。:-)我想到了另一种选择是选择所有没有office_completed键或office_completed != 'true'但无法弄清楚该怎么做的记录。
如果有人对此有更好的主意,我将不胜感激。谢谢!
我想将JSON字符串插入具有jsonb字段的Postgres表中,并希望插入查询返回JSON的一部分。例如,我想在下面的示例中返回ID。问号上出现了什么?
insert into mytable (myjson)
values ('{"id":123}') returning ???
Run Code Online (Sandbox Code Playgroud) 我试图在Postgres数据库中查询某个值.我有一个groups在users表中命名的字段,可以用以下任何一种方式表示:
1.
groups: {"data"=>[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}
Run Code Online (Sandbox Code Playgroud)
2.
groups: [{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]
Run Code Online (Sandbox Code Playgroud)
我对这两种表述都很好.但是,我似乎无法找到如何让所有在系列5中的用户让我们说.我尝试了多个查询:
@users = User.where("groups ->> 'data' @> ?", {serie: 5})
@users = User.where("groups -> 'data' @> '?'", {serie: 5})
@users = User.where("groups ->> 'data' ->> 'serie' = ?", 5)
Run Code Online (Sandbox Code Playgroud)
还有许多其他尝试,有些比其他尝试更愚蠢(见上文).我该怎么办?
我已经能够确定:
select groups -> 'data' ->> 'serie' from users;
ERROR: cannot extract field from a non-object.
Run Code Online (Sandbox Code Playgroud)
但是以下查询有效:
select json_array_elements(groups -> 'data') …Run Code Online (Sandbox Code Playgroud) 如何修改PostgreSQL JSONB数据类型中的单个字段?
假设我有一张叫做动物的桌子:
id info
------------------------------------------------------------
49493 {"habit1":"fly","habit2":"dive","location":"SONOMA NARITE"}
Run Code Online (Sandbox Code Playgroud)
我想简单地更改location属性的值(例如,大写或小写文本).所以结果,在UPDATE之后
id info
------------------------------------------------------------
49493 {"habit1":"fly","habit2":"dive","location":"sonoma narite"}
Run Code Online (Sandbox Code Playgroud)
我在下面尝试了这个,它不起作用
update animal set info=jsonb_set(info, '{location}', LOWER(info->>'location'), true) where id='49493';
----------------------------------
ERROR: function jsonb_set(jsonb, unknown, text, boolean) does not exist
LINE 7: update animal set info=jsonb_set(info, '{con...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
********** Error **********
ERROR: function jsonb_set(jsonb, unknown, text, boolean) does not exist
Run Code Online (Sandbox Code Playgroud)
如果我只是知道更新的值是什么,那么我可以使用这个:
update animal set info=jsonb_set(info, '{location}', …Run Code Online (Sandbox Code Playgroud) 如果我有一些json:
id = 1, json = {'key':95}
id = 2, json = {'key':90}
id = 3, json = {'key':50}
Run Code Online (Sandbox Code Playgroud)
有没有办法我可以使用Postgres字段来查询大于> = 90的密钥?
我在我的数据库中有一个从一种类型的jsonb调用"info"的列,如下所示:
info={'duration','metrics'}
Run Code Online (Sandbox Code Playgroud)
我想使用hql查询来获取'duration'的数据
这是我正在尝试的查询:
@Query(value = "select new com.hyginex.service.statistic.dto.NewWristbandRecordByUser(wrp.user.id, wrp.recordTimestamp, wrp.id, wrp.device.id, wrp.rssi, wrp.beacon.id, wrp.beacon.locatableType) " +
"from WristbandRecordProcessed wrp where wrp.user.id = :userId and wrp.rssi is null and wrp.recordTimestamp > :lastTimestamp and wrp.recordType = 'HANDWASH' and (wrp.info->'duration')*(wrp.avgCrossing)>100 order by wrp.recordTimestamp ")
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时我会收到错误:
(wrp.info->'duration')
Run Code Online (Sandbox Code Playgroud)
即使没有'',我也试过了,但仍然没有奏效.