Sql JSON_值的Postgres语句

Sql JSON_值的Postgres语句,sql,json,postgresql,Sql,Json,Postgresql,此SQL语句的postgres语句是什么 SELECT * FROM table1 where JSON_VALUE(colB,'$.Items[0].Item') ='abc' 我试过跟踪postgres文档,但结果是 没有与给定名称和参数类型匹配的函数类似的函数 SELECT t.* FROM table1 t cross join json_array_elements(colb->'Items') as j where j->>'Item' = '

此SQL语句的postgres语句是什么

SELECT * FROM table1 where JSON_VALUE(colB,'$.Items[0].Item') ='abc'
我试过跟踪postgres文档,但结果是 没有与给定名称和参数类型匹配的函数

类似的函数

SELECT t.*
     FROM table1  t
    cross join json_array_elements(colb->'Items') as j
where j->>'Item' = 'abc'

您可以使用访问索引中的元素

SELECT * 
FROM table1 
where colb -> 'Items' -> 0 ->> 'Item' = 'abc'
colb->'Items'->0
Items
的第一个数组元素作为JSON值返回。然后将JSON中的键
“Item”
作为
文本
(也称为varchar)值返回

这要求将
colb
定义为
jsonb
(或至少
json
)。如果没有,您需要像这样强制转换它
colb::jsonb

但从长远来看,您应该真正将该列转换为
jsonb


如果要搜索
项目
数组中的任何位置(不仅仅是位置0),可以使用
@
运算符:

select *
from data
where colb @> '{"Items": [{"Item": "abc"}]}';
在线示例:

上面可以在列
colb
上使用GIN索引。第一个查询将需要该表达式上的索引


使用Postgres 12,您可以使用JSON路径查询,如下所示:

SELECT * 
FROM table1 
where jsonb_path_exists(colb, '$.Items[0].Item' ? (@ == "abc")');
如果要搜索阵列中的任何位置,可以使用:

SELECT * 
FROM table1 
where jsonb_path_exists(colb, '$.Items[*].Item' ? (@ == "abc")');

这同样不能使用列上的GIN索引,它将需要该表达式上的索引

此处尝试了所有操作,但不起作用。错误:运算符不存在:文本->未知第3行:交叉连接json_数组_元素(colb->“Items”)提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。我看到了您的演示,我不需要进一步处理该列。就像sql查询一样简单,显示行记录。@user12158726:colB的数据类型是什么?它应该是json,否则您需要强制转换它