2013-04-18 29 views
15

Tôi có cột TEXT chứa chuỗi JSON hợp lệ.PostgreSQL 9.2 - Chuyển đổi chuỗi JON TEXT thành kiểu 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"}'); 

Tôi muốn chuyển đổi một số trường thành định dạng có thể truy vấn.

A REGEXP_REPLACE cho mỗi trường sẽ làm (language trường và gender trường). Nhưng kể từ đó là hợp lệ JSON, là có cách để:

  • Chuyển đổi thành kiểu JSON
  • Chuyển đổi thành loại hstore
  • Hoặc cách nào khả thi khác

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

+2

chức năng yêu cầu là một trong những tính năng thú vị từ 9.3. Tôi đọc một số bài viết được mô tả bằng cách sử dụng pl/js8 cho mục đích này http://www.postgresonline.com/journal/archives/263-PLV8JS-and-PLCoffee-Part-2-JSON-search-requests.html –

+0

Cảm ơn. Tôi cũng phát hiện ra rằng tôi có thể làm điều đầu tiên bằng cách chỉ cần đưa nó vào JSON: 'settings :: json'. Nhưng nó không phải là truy vấn có thể mặc dù. Giải quyết với regexp. – huy

+0

FYI có một backport của 9.3 cải tiến chức năng JSON cho PostgreSQL 9.2 http://adpgtech.blogspot.co.nz/2013/04/backport-of-93-json-enhancements.html –

Trả lời

3

Nếu bạn cần một chỉ mục trên nó, tạo ra một hàm không thay đổi mà lấy json làm đầu vào và mang lại trường bạn muốn làm đầu ra bằng ngôn ngữ pl, ví dụ:

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

Sau đó thêm một chỉ mục trên các biểu hiện:

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

Chỉ số sẽ sau đó (khả năng) được sử dụng trong các truy vấn như:

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

Tôi cần điều tương tự. Điều này đã làm công việc độc đáo. Điều đó nói rằng, tôi không thể nói về cách thực hiện nó là mặc dù như tôi đang truy vấn một số liệu tương đối nhỏ. – slant

11

Hoặc trong một con đường ngắn nhất hơn Reza:

SELECT settings::json FROM users; 

Sau đó, để lựa chọn ngôn ngữ ví dụ:

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

tin chi tiết về các official documentation.

+1

Tôi biết điều này là yên tĩnh cũ, nhưng: Làm thế nào tôi có thể tìm kiếm một trường đặc biệt trong văn bản, cho phép nói cài đặt WHERE :: json = 'team_id': team_id (để nói để tìm kiếm một trường cụ thể trong văn bản của cài đặt)? – Pille

Các vấn đề liên quan