2013-04-18 52 views
15

我有一个TEXT列包含有效的JSON字符串。PostgreSQL 9.2 - 将TEXT json字符串转换为json/hstore类型

CREATE TABLE users(settings TEXT); 

INSERT INTO users VALUES ('{"language":"en","gender":"male"}'); 
INSERT INTO users VALUES ('{"language":"fr","gender":"female"}'); 
INSERT INTO users VALUES ('{"language":"es","gender":"female"}'); 
INSERT INTO users VALUES ('{"language":"en","gender":"male"}'); 

我想将某些字段转换为查询格式。

A REGEXP_REPLACE会为每个字段做(language字段和gender字段)。但因为它是有效的JSON,是有办法:

  • 转换成JSON类型
  • 转换成hstore型
  • 或任何其他可行的方式

SQLFiddle:http://sqlfiddle.com/#!12/54823

+2

请求的功能是从一个有趣的功能9.3。我读了一些文章,其中描述使用pl/js8为此目的http://www.postgresonline.com/journal/archives/263-PLV8JS-and-PLCoffee-Part-2-JSON-search-requests.html – 2013-04-18 05:41:13

+0

谢谢。我还发现我可以通过将它转换为JSON来执行第一个操作:'settings :: json'。但它不能查询。以正则表达式结算。 – huy 2013-04-18 07:35:25

+0

仅供参考对于PostgreSQL 9.2,有一个9.3 JSON函数增强的backport http://adpgtech.blogspot.co.nz/2013/04/backport-of-93-json-enhancements.html – 2013-04-27 10:22:36

回答

3

如果你需要一个索引,创建一个不可变的函数,将json作为输入并生成你想要的输出为pl语言的字段,例如:

create function extract_language(text) returns text as $$ 
    -- parse $1 as json 
    -- return $1.language 
$$ language whatever immutable; 

然后在表达添加索引:

create index users_language on users(extract_language(settings)); 

索引然后将(可能)获取查询中使用,例如:

select * from users where extract_language(settings) = 'en'; 
16
SELECT cast(settings AS json) from users; 
+0

我需要完全相同的东西。这很好地完成了这项工作。也就是说,我不能说它是如何执行的,因为我正在查询一个相对较小的数据集。 – slant 2015-03-06 23:26:45

11

或者在最短的方式比Reza:

SELECT settings::json FROM users; 

然后,选择语言,例如:在official documentation

SELECT settings::json->>'language' FROM users; 

更多细节。

+1

我知道这是安静的老,但是:我如何搜索文本中的特殊字段,可以说WHERE settings :: json ='team_id':team_id(这样说来搜索设置文本中的特定字段)? – Pille 2017-01-24 09:40:49