标签: jsonb

在 PostgreSQL 中搜索 jsonb 数组

我正在尝试在 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)

regex postgresql jsonb

6
推荐指数
1
解决办法
3079
查看次数

如何在Postgres中仅从jsonb类型中选择特定键的值

我有一个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从表中选择?那会回答.

postgresql jsonb

6
推荐指数
1
解决办法
5660
查看次数

PostgreSQL 用另一列的值更新 JSONB 列

我想将数据从一列 (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 做到这一点? …

sql postgresql jsonb postgresql-9.4

6
推荐指数
2
解决办法
1648
查看次数

以逗号分隔的列表形式返回 jsonb_array_elements 结果

我正在访问一个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 函数返回一个“文本集”,我想将其转换为包含在单个字段中的逗号分隔的数组值列表。

谢谢你。

postgresql json jsonb postgresql-9.5

6
推荐指数
1
解决办法
7811
查看次数

查询键不存在的Postgres JSONB

给定一组数据。

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'但无法弄清楚该怎么做的记录。

如果有人对此有更好的主意,我将不胜感激。谢谢!

postgresql jsonb

6
推荐指数
2
解决办法
2163
查看次数

将JSON字符串插入Postgres并返回字段

我想将JSON字符串插入具有jsonb字段的Postgres表中,并希望插入查询返回JSON的一部分。例如,我想在下面的示例中返回ID。问号上出现了什么?

insert into mytable (myjson)
values ('{"id":123}') returning ???
Run Code Online (Sandbox Code Playgroud)

postgresql json jsonb

6
推荐指数
1
解决办法
1万
查看次数

查询Rails中的Postgres JSON数组字段

我试图在Postgres数据库中查询某个值.我有一个groupsusers表中命名的字段,可以用以下任何一种方式表示:

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)

arrays postgresql json ruby-on-rails jsonb

6
推荐指数
1
解决办法
4121
查看次数

如何修改PostgreSQL JSONB数据类型中的单个属性值?

如何修改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)

postgresql json jsonb

6
推荐指数
2
解决办法
5717
查看次数

我怎样才能比JSON Postgres字段做得更少?

如果我有一些json:

id = 1, json = {'key':95}
id = 2, json = {'key':90}
id = 3, json = {'key':50}
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以使用Postgres字段来查询大于> = 90的密钥?

postgresql jsonb

6
推荐指数
2
解决办法
3634
查看次数

如何使用hql查询从jsonb获取数据

我在我的数据库中有一个从一种类型的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)

即使没有'',我也试过了,但仍然没有奏效.

postgresql json hibernate hql jsonb

6
推荐指数
0
解决办法
699
查看次数