如何将PostgreSQL与JSONB数据一起使用

阿卜杜

有关的

看到这个问题

问题

我有一个postgresql表,该表具有jsonb类型的列。json数据看起来像这样

{
   "personal":{
      "gender":"male",
      "contact":{
         "home":{
            "email":"[email protected]",
            "phone_number":"5551234"
         },
         "work":{
            "email":"[email protected]",
            "phone_number":"5551111"
         }
      },
      ..
      "nationality":"Martian",
      ..
   },
   "employment":{
      "title":"Chief Executive Officer",
      "benefits":[
         "Insurance A",
         "Company Car"
      ],
      ..
   }
}

该查询运行良好

select employees->'personal'->'contact'->'work'->>'email' 
from employees 
where employees->'personal'->>'nationality' in ('Martian','Terran')

我想获取所有受益于Insurance AOR类型的员工Insurance B,这个丑陋的查询有效:

 select employees->'personal'->'contact'->'work'->>'email' 
   from employees 
   where employees->'employment'->'benefits' ? 'Insurance A' 
   OR employees->'employment'->'benefits' ? 'Insurance B';

我想使用任何类似的方式:

select * from employees 
where employees->'employment'->>'benefits' = 
any('{Insurance A, Insurance B}'::text[]);

但这会返回0个结果..想法?

我也尝试过

我尝试了以下语法(全部失败):

.. = any({'Insurance A','Insurance B'}::text[]);
.. = any('Insurance A'::text,'Insurance B'::text}::array);
.. = any({'Insurance A'::text,'Insurance B'::text}::array);
.. = any(['Insurance A'::text,'Insurance B'::text]::array);
克林

employees->'employment'->'benefits'是一个json数组,因此您应取消嵌套以使用其元素进行any比较。jsonb_array_elements_text()横向连接中使用该功能

select *
from 
    employees, 
    jsonb_array_elements_text(employees->'employment'->'benefits') benefits(benefit)
where
    benefit = any('{Insurance A, Insurance B}'::text[]);

语法

from 
    employees, 
    jsonb_array_elements_text(employees->'employment'->'benefits')

相当于

from 
    employees, 
    lateral jsonb_array_elements_text(employees->'employment'->'benefits')

该词lateral可以省略。对于文档

LATERAL也可以在函数调用FROM项之前,但是在这种情况下,它是一个干扰词,因为在任何情况下,函数表达式都可以引用更早的FROM项。

另请参见:LATERAL和PostgreSQL中的子查询之间有什么区别?

语法

from jsonb_array_elements_text(employees->'employment'->'benefits') benefits(benefit)

根据文档,是别名的一种形式

表别名的另一种形式为表的列以及表本身赋予临时名称:

FROM table_reference [AS]别名(column1 [,column2 [,...]])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将数据从Postgresql数据提取到数据框以与sqldf一起使用

如何将数据集与 cloneelement 一起使用?

如何将 ngClass 与数据绑定一起使用?

如何将useState()与Flatlist数据一起使用?

是否可以将Hibernate与PostgreSql的JSONB数据类型一起使用?

如何将日期/时间函数与 JSONB 值一起使用?

如何将ActiveModel :: Serializer与PostgreSQL JSON列一起使用

Postgresql 9.3:如何将交叉表与多个索引一起使用?

如何将flask_sqlalchemy与PostgreSQL的“ INSERT ... ON CONFLICT”(UPSERT)功能一起使用?

如何将数据表与数据对象一起使用?

如何将 MERGE 语句与 VARBINARY 数据一起使用

如何将 LogisticRegressionWIthLBFGS 与 Spark 中的数据帧一起使用

如何将Spring Boot与MySQL数据库和JPA一起使用?

如何将div与子表一起使用以隐藏数据

如何将单个dbml文件与不同的数据库一起使用

情节:如何将下拉菜单与pandas数据框一起使用?

如何将pd.concat与未初始化的数据帧一起使用?

如何将 querySelector 与数据属性和类一起使用?

如何将 make_blob 与数据框一起使用?

如何将fit_generator与分割成批的顺序数据一起使用?

如何将statsmodels.tsa.seasonal.seasonal_decompose与pandas数据框一起使用

如何将map()与axios响应中的数据一起使用?

如何将`matches()` 与数据库函数一起使用?

如何将动态按钮与数组数据一起使用

如何将Room Persistence Library与预填充的数据库一起使用?

如何将标准验证数据注释与自定义类型一起使用?

如何将tqdm与数据帧映射一起使用

如何将ReactiveUI与分层数据源一起使用(树形视图)

如何将ng-if与异步数据一起使用