Postgresql:通过带有索引的通配符和比较运算符在JSON数组中查找值

Postgresql:通过带有索引的通配符和比较运算符在JSON数组中查找值,第1张

概述我有一个表,我想搜索 JSON数组数据. CREATE TABLE data (id SERIAL, json JSON);INSERT INTO data (id, json) VALUES (1, '[{"name": "Value A", "value": 10}]');INSERT INTO data (id, json) VALUES (2, '[{"name": " 我有一个表,我想搜索 JSON数组数据.
CREATE table data (ID SERIAL,Json JsON);INSERT INTO data (ID,Json)   VALUES (1,'[{"name": "Value A","value": 10}]');INSERT INTO data (ID,Json)   VALUES (2,'[{"name": "Value B1","value": 5},{"name": "Value B2","value": 15}]');

如this answer所述,我创建了一个函数,它还允许在数组数据上创建索引(重要).

CREATE OR REPLACE FUNCTION Json_val_arr(_j Json,_key text)  RETURNS text[] AS$$SELECT array_agg(elem->>_key)FROM   Json_array_elements(_j) AS x(elem)$$  LANGUAGE sql IMMUtable;

如果我想找到一个完整的值(例如“Value B1”),这很好用:

SELECT *FROM dataWHERE '{"Value B1"}'::text[] <@ (Json_val_arr(Json,'name'));

现在我的问题:

>是否可以使用通配符查找值(例如“Value *”)?像以下(天真)方法的东西:

...WHERE '{"Value%"}'::text[] <@ (Json_val_arr(Json,'name'));

>是否可以使用比较运算符查找数值(例如> = 10)?再次,一个天真的,明显错误的方法:

...WHERE '{10}'::int[] >= (Json_val_arr(Json,'value'));

我试图创建一个返回int []的新函数但是没有用.

我创建了一个SQL Fiddle来说明我的问题.

或者使用不同的方法(如以下工作查询)会更好:

SELECT *FROM data,Json_array_elements(Json) JsondataWHERE Jsondata ->> 'name' liKE 'Value%';

...WHERE cast(Jsondata ->> 'value' as integer) <= 10;

但是,对于这些查询,我无法创建查询实际拾取的任何索引.

另外,我想最终在Postgresql 9.4中使用JsONB实现所有这些,但我认为对于上述问题,这应该不是问题.

非常感谢你!

我知道它已经有一段时间,但我只是在玩类似的东西(使用通配符查询Json数据类型),并认为我会分享我发现的东西.

首先,这是朝着正确方向迈出的一大步:
http://schinckel.net/2014/05/25/querying-json-in-postgres/

需要注意的是,将Json元素爆炸成其他东西(记录集)的方法是可行的.它允许您使用正常的postgres内容查询Json元素.

就我而言:

#table:test    ID | Jsonb_column     1 | {"name": "","value": "reserved","expires_in": 13732}     2 | {"name": "poop","value": "{\"ns\":[\"Whaaat.\"]}","expires_in": 4554}      3 | {"name": "dog","value": "{\"ns\":[\"woof.\"]}","expires_in": 4554}

示例查询

select * from test Jsonb_to_recordset(x) where Jsonb_column->>'name' like '%o%';# => Returns# 2 | {"name": "poop","expires_in": 4554}

并回答你关于Jsonb的问题:看起来Jsonb是当时最好的路线.它有更多的方法和更快的读取(但写入速度更慢)时间.

资料来源:

> http://www.postgresql.org/docs/9.4/static/functions-json.html
> http://www.postgresql.org/docs/9.4/static/datatype-json.html

快乐狩猎!

总结

以上是内存溢出为你收集整理的Postgresql:通过带有索引的通配符和比较运算符在JSON数组中查找值全部内容,希望文章能够帮你解决Postgresql:通过带有索引的通配符和比较运算符在JSON数组中查找值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存