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数组中查找值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)