2013-04-18 51 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