加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 在PostgreSQL中搜索jsonb数组

发布时间:2020-12-14 06:32:13 所属栏目:百科 来源:网络整理
导读:我正在尝试在PostgreSQL 9.4中搜索JSONB对象.我的问题类似于 this thread. 但是我的数据结构略有不同,这导致了我的问题.我的数据结构如下: [ {"id":1,"msg":"testing"} {"id":2,"msg":"tested"} {"id":3,"msg":"nothing"}] 我想通过msg(RegEx,LIKE,=等)搜索
我正在尝试在PostgreSQL 9.4中搜索JSONB对象.我的问题类似于 this thread.

但是我的数据结构略有不同,这导致了我的问题.我的数据结构如下:

[
    {"id":1,"msg":"testing"}
    {"id":2,"msg":"tested"}
    {"id":3,"msg":"nothing"}
]

我想通过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;

这显示了尝试实现上述链接的答案,但不起作用(返回0行):

SELECT * FROM 
    (SELECT 
        '[{"id":1,"msg":"nothing"}]'::jsonb as data) 
    as jsonbexample 
WHERE 
    (data #>> '{msg}') LIKE '%est%';

任何人都可以解释如何搜索JSONB数组?在上面的例子中,我想在表中找到其“data”JSONB字段包含“msg”匹配的对象的任何行(例如,LIKE’%est%’).

更新

此代码创建一个新类型(以后需要):

CREATE TYPE AlertLine AS (id INTEGER,msg TEXT);

然后你可以用它来用JSONB_POPULATE_RECORDSET来拆分列:

SELECT * FROM 
    JSONB_POPULATE_RECORDSET(
        null::AlertLine,(SELECT '[{"id":1,"msg":"nothing"}]'::jsonb 
         as data
        )
    ) as jsonbex;

输出:

id |   msg   
----+---------
  1 | testing
  2 | tested
  3 | nothing

并加入限制:

SELECT * FROM 
    JSONB_POPULATE_RECORDSET(
        null::AlertLine,"msg":"nothing"}]'::jsonb 
         as data)
        ) as jsonbex 
WHERE 
    msg LIKE '%est%';

输出:

id |   msg   
---+---------
 1 | testing
 2 | tested

所以问题的一部分仍然是如何将其作为另一个查询中的子句.

那么,如果上面代码的输出= x,我该怎么问:

SELECT * FROM mytable WHERE x > (0 rows);
你可以使用exists:
SELECT * FROM 
    (SELECT 
        '[{"id":1,"msg":"nothing"}]'::jsonb as data) 
    as jsonbexample 
WHERE 
    EXISTS (SELECT 1 FROM jsonb_array_elements(data) as j(data) WHERE (data#>> '{msg}') LIKE '%est%');

要查询表格,如下面的评论中所述:

SELECT * FROM atable 
WHERE EXISTS (SELECT 1 FROM jsonb_array_elements(columnx) as j(data) WHERE (data#>> '{msg}') LIKE '%est%');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读