Postgres에서 JSON 필드에 인덱스를 만드는 방법은 무엇입니까?


111

PostgreSQL 9.3 베타 2 (?)에서 JSON 필드에 인덱스를 생성하려면 어떻게해야합니까? 사용 된 ->연산자를 사용 하여 시도했지만 hstore다음 오류가 발생했습니다.

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

오류 : json 데이터 유형에 액세스 방법 "btree"에 대한 기본 연산자 클래스가 없습니다. 힌트 : 인덱스에 대한 연산자 클래스를 지정하거나 데이터 유형에 대한 기본 연산자 클래스를 정의해야합니다.


8
"질문은 어디에 있습니까?" -제목에서
rlib

2
앞으로 "더 나은 질문하기"섹션 인 stackoverflow.com/tags/postgresql/info를 살펴보십시오 . 성가신 질문을 줄이고 더 빨리 더 나은 답변을 얻을 수 있습니다.
Craig Ringer

답변:


186

녹이다:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

주석에서 언급했듯이 여기에 미묘한 차이점 ->>->. 전자는 값을 텍스트로, 후자는 JSON 객체로 반환합니다.



39
차이를 찾고있는 경우를 대비하여 : ->>대신 ->. 전자는 값을 텍스트로 반환하고 후자는 JSON 객체를 반환합니다.
Daniel Rikowski

35
이중 괄호도 중요합니다.
Ron

11
그것은 그들을 추출 @Jac_opo TEXT 하지만. 문자열 비교 대신 정수 비교를 수행하려면 캐스트 :를 추가해야합니다 ((info->>'name')::INT).
jpmc26

13
@DanielRikowski 덕분에 JSON 열의 하위 개체 내부에있는 필드에 인덱스를 만들려면 create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));먼저해야 할 일을 알아 냈습니다. 먼저 ->JSON 개체 ->>를 가져 오고 자식 개체 값을 본문.
Corey Cole
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.