2013-04-18 14 views
15

Mam kolumnę TEXT zawierającą prawidłowy ciąg JSON.PostgreSQL 9.2 - Konwertuj ciąg tekstowy TEKST na typ 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"}'); 

Chcę przekształcić niektóre pola do formatu nadającego się do zapytania.

Dla każdego pola będzie (language pole i gender pole). Ale ponieważ jest to ważne JSON, czy istnieje sposób, aby:

  • Konwersja do typu JSON
  • Konwersja do typu hstore
  • lub innych możliwych sposobów

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

+2

Żądana funkcjonalność jest jednym z ciekawych funkcji 9.3. Czytałem niektóre artykuły, w których opisano użycie w tym celu języka pl/js8 http://www.postgresonline.com/journal/archives/263-PLV8JS-and-PLCoffee-Part-2-JSON-search-requests.html –

+0

Dzięki. Odkryłem też, że mogę zrobić pierwszy, po prostu rzucając go na JSON: 'settings :: json'. Ale nie jest to możliwe do sprawdzenia. Rozstrzygnięty z regexp. – huy

+0

FYI jest backport 9.3 poprawek funkcji JSON dla PostgreSQL 9.2 http://adpgtech.blogspot.co.nz/2013/04/backport-of-93-json-enhancements.html –

Odpowiedz

3

Jeśli potrzebujesz indeksu na nim, stwórz niezmienną funkcję, która bierze json jako dane wejściowe i daje żądane pole jako wyjście w języku pl, np:

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

Następnie dodać indeks na ekspresję:

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

Indeks będzie to (potencjalnie) przyzwyczaić się zapytań takich jak:

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

Potrzebowałem dokładnie tego samego. To ładnie wykonało zadanie. To powiedziawszy, nie mogę mówić o tym, jak wydajne jest to, ponieważ pytam o stosunkowo mały zbiór danych. – slant

11

Albo w najkrótszej drodze niż Reza:

SELECT settings::json FROM users; 

Następnie do wyboru języka, na przykład:

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

Więcej szczegółów na official documentation.

+1

Wiem, że jest cicho stary, ale: Jak mogę wyszukać specjalne pole w tekście, powiedzmy, GDZIE ustawienia :: json = 'team_id': team_id (aby powiedzieć, aby wyszukać określone pole w tekście ustawień)? – Pille