检测 jsonb 属性是数组还是对象

Posted

技术标签:

【中文标题】检测 jsonb 属性是数组还是对象【英文标题】:Detect if a jsonb attribute is array or object 【发布时间】:2018-04-10 09:25:57 【问题描述】:

许多 jsonb/json 函数期望列的所有值都是 json 数组类型(如 jsonb_array_length)或仅为 json 对象(如 jsonb_build_oject)。

数据库中有一些 jsonb 列包含数组和对象根的混合,有没有简单的方法来过滤掉数组和对象,以便像这样的查询

SELECT DISTINCT jsonb_object_keys(my_column) FROM my_table;
 cannot call jsonb_object_keys on an array

SELECT my_column FROM my_table WHERE jsonb_array_length(column) > 0;
cannot get array length of a non-array

【问题讨论】:

【参考方案1】:

如documentation 中所述,函数jsonb_typeofjson_typeof 可用于应用这种过滤

喜欢

SELECT DISTINCT jsonb_object_keys(my_column) 
FROM my_table WHERE jsonb_typeof(column) ='object' ;

SELECT my_column FROM my_table 
WHERE jsonb_array_length(column) > 0 
AND jsonb_typeof(column) ='array' ;

【讨论】:

以上是关于检测 jsonb 属性是数组还是对象的主要内容,如果未能解决你的问题,请参考以下文章

从 jsonb 数组包含具有特定属性的元素的表中选择

PostgreSQL:更新JSONB结构中嵌套数组中元素的属性

Postgresql Jsonb字段内含数组属性的删除元素操作

使用 PostgreSQL 查询更新复杂 JSONB 对象以删除子子属性

检测二维数组中具有共同属性的连续对象

ngOnChanges无法检测数组内容修改时解决方案