2016-07-21 5 views
0
나는 열을 가지고

주소 입력 jsonb[] 내에서 같은 것을보고 배열 포함 하우스 JSON 속성에 일치하는 9.5 쿼리 :포스트 그레스 테이블 내에서, 배열

"{ 
    "{\"zip\": \"13203-1807\", 
    \"city\": \"\SYRACUSE\", 
    \"state\": \"NEW YORK\", 
    \"street\": \"\999 PROSPECT AVENUE\"}" 
}" 

나는 모든 주택을 조회하려고를 주소시는 "Syracuse"입니다.

SELECT * FROM Houses WHERE address -> 'city' = 'SYRACUSE' 

을 그리고이 오류가 나타납니다 : 지금까지 내가 가진 내가 아무 소용이 여러 StackOverflow의 답변뿐만 아니라 PG Official Documentation on JSON Functions and Operators을 통해 보았다

No operator matches the given name and argument type(s). You might need to add explicit type casts. 

합니다.

+0

열 유형이'jsonb' 또는'jsonb []'입니까? '-> '연산자는 전자 연산자로 작동하지만 후자는 postgresql 배열이며 배열 연산자가 필요합니다. – jmelesky

+0

'jsonb []'@jmelesky – Will

+0

호기심 때문에 왜? JSON에는 이미 배열이 포함될 수 있으므로 JSON 객체의 JSON 배열에 postgresql 배열의 JSON 객체를 저장하려는 이유가 분명하지 않습니다. – jmelesky

답변

1

위의 설명에서 언급했듯이 postgresql 배열에서 JSON 연산자를 사용하려고합니다. 따라서 형식 오류가 발생합니다. 이 필드에 실제로 저장하려는 항목에 따라이 방법에 접근 할 수있는 몇 가지 방법이 있습니다. 이 예를 들어

, 나는 다음과 같은 테이블 가정거야 : 당신이 jsonb의 포스트 그레스 배열하고 싶다면

CREATE TABLE houses (id INT, address <some datatype>); 

을, 당신은 당신과 같이 할 수있는 배열을 풀고해야 : 다른 한편으로는, 당신은 JSON 배열을 사용하려는 경우 (여전히 배열을 unnest 필요하기 때문에 매우 유사)

WITH all_addresses AS (
    SELECT id, unnest(address) as add 
    FROM houses) 
SELECT * 
    FROM houses h 
    WHERE 
    id IN (SELECT id 
      FROM all_addresses 
      WHERE add->'city' = to_jsonb('SYRACUSE'::text)); 

, 다음 쿼리는 다음과 같습니다

WITH all_addresses AS (
    SELECT id, jsonb_array_elements(address) as add 
    FROM houses) 
SELECT * 
    FROM houses h 
    WHERE 
    id IN (SELECT id 
      FROM all_addresses 
      WHERE add->'city' = to_jsonb('SYRACUSE'::text)); 

귀하의 질문에 대해서는 말씀 드릴 수는 없지만 예제 데이터와 해당 열의 이름이 '주소'라는 사실에 근거하여 해당 열에 행당 하나의 주소 만 저장하는 것이 가능할 수 있습니다. '구애'). 그렇다면 쿼리가 훨씬 간단 해집니다.

SELECT * 
    FROM houses 
    WHERE address->'city' = to_jsonb('SYRACUSE'::text);