Sql JSON_值的Postgres语句
此SQL语句的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' = '
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,否则您需要强制转换它