2014-02-11 3 views
2

데이터베이스를 만들 때 Postgres 9.3.2을 사용하고 있습니다.Postgres SELECT * FROM 테이블에서 배열에 요소가있는 경우

예 : 내 표에 다음과 같은 행이 있습니다.

{ 
    firstName : "First name" 
    lastName : "Last name" 
    emails : ["[email protected]", "[email protected]", "[email protected]] 
} 

PS : 이름, 성 및 이메일 내 DB 열이며 연관된 값이 특정 행의 그 컬럼에 대한 값이다.

내가 "[email protected]"전자 메일을 쿼리하면 그 결과가 아무 것도 아니지만 "[email protected]"에 대한 쿼리가 위 결과가되도록 DB를 쿼리 할 수 ​​있기를 원합니다. 행 항목.

나는

"Select * from contactTable where emails="[email protected]""

이 작동 쿼리를 같아요. 대신 나는 같은 것을하고 싶다

"Select * from contactTable where emails contains "[email protected]"" 

이것을하는 방법에 대한 아이디어?

+3

전자 메일과 전화 번호가 개별 필드가되도록 DB를 정규화 할 수 있습니까? 훨씬 간단합니다 ... – n8wrl

+0

@ n8wrl 저는 이것이 올바른 방법이라고 생각합니다. 그러나 많은 이유들로 인해 이것을 할 수없는 경우가 많습니다 (비 기술적 인 이유들). =) –

+1

@ AndréFigueiredo : 이해합니다. 이것은 XML을 blob로 저장 한 과거 프로젝트의 나쁜 기억을 되살려줍니다. 검색이 불가능합니다.정상화가 답이었습니다. – n8wrl

답변

1

Postgres는 JSON 구문 분석을 지원합니다. 다음은 문서입니다 : http://www.postgresql.org/docs/9.3/static/functions-json.html. 정확한 데이터와 스키마를 제공하지 않았기 때문에 더 자세한 답변을 드릴 수는 없지만 문서에서 적절한 기능을 쉽게 찾을 수 있습니다.

3

"를 선택 * 이메일에 포함 된 곳 contactTable에서" "

내가 원하는 생각 :

"[email protected] "contactTable SELECT * FROM 곳 thejsonfield -> 이메일

예제 설치, 완전히 깨진 json을 수정 한 후 :

CREATE TABLE contacts AS SELECT '{ 
    "firstName" : "First name", 
    "lastName" : "Last name", 
    "emails" : ["[email protected]", "[email protected]", "[email protected]"] 
}'::json AS myjsonfield; 

다음은 PostgreSQL의 9.4에서 작동하지만, 불행히도 인해 누락 된 json_array_elements_text 함수의 감독에 9.3하지 않는 것

select * 
from contacts, 
lateral json_array_elements_text(myjsonfield -> 'emails') email 
where email = '[email protected]'; 

9.3를 들어,이 값을 일치의 JSON 배열을 검사하는 웃기시 방법을 사용하는 :

select * 
from contacts, 
lateral json_array_length(myjsonfield -> 'emails') numemails, 
lateral generate_series(0, numemails) n 
WHERE json_array_element_text(myjsonfield -> 'emails', n) = '[email protected]'; 

(이 시점에서) PostgreSQL을 사용하면 JSON 배열을 가질 수 있음을 이해하지 않기 때문에 당신은 간단한 IN 또는 = ANY 구조를 사용할 수 없습니다, 그래서 실패 할 것이다 :

regress=> SELECT * FROM contacts WHERE '[email protected]' = ANY (myjsonfield->'emails'); 
ERROR: op ANY/ALL (array) requires array on right side 
LINE 1: SELECT * FROM contacts WHERE '[email protected]' = ANY (myjsonfi... 
                ^

json 배열이 아닌 PostgreSQL 배열을 필요로하므로 json 배열을 PostgreSQL 배열로 변환하는 편리한 기본 제공이 없습니다.

관련 문제