2013-06-12 7 views
2

약 5 분 전까지 배열 형식의 VARCHAR 형식을 얻지 못했습니다."VarChar Array"유형의 postgresql 테이블에 가입 하시겠습니까?

PEOPLE 
ID | PERSON | GROUPS 
1 | John | {ONE,TWO} 
2 | Jack | {TWO} 
3 | Jill | {ONE,TWO,THREE} 
4 | Jim | {TWO,THREE} 

GROUPS 
ID | TITLE 
ONE | First 
TWO | Second 
THREE | Third 

나는 이런 식으로 뭔가 끝낼 싶습니다 : 어떻게이 테이블을 결합 할 것입니다

ID | PERSON | GROUP 
1 | John | ONE 
1 | John | TWO 
2 | Jack | TWO 
3 | Jill | ONE 
3 | Jill | TWO 
3 | Jill | THREE 
4 | Jim | TWO 
4 | Jim | THREE 

어떻게 하나 개의 쿼리에서이 권리를 얻을 것? ,

select id, person, unnest(groups) as grp 
from people 

내가 먼저 원하는 실제로 당신을 추측하고있어 :

특정 쿼리

답변

2

, 그것은 선택 성명의 일부 때 여러 행에 단일 행을 확장 할 수 있습니다 unnest()를 사용하여 구문 트릭, 거기에 둘째, 하나, 둘, 셋보다는 셋째로 나타난다. 당신과 같이 가입 할 수 있습니다 :

with unnested_people as (
select id, person, unnest(groups) as grp 
from people 
) 
select id, person, title 
from unnested_people 
join groups on groups.id = unseated_people.grp 
+1

누구나이 점을 분명히 테스트하고 구문 트릭이 상당히 잘 작동하는지 확인해야합니다. '1을 a, unest ('{2,3}':: int [])를 b;로 선택하십시오. –

+0

확실히 무엇을 찾고 있었습니까! :) – coderama

+0

그리고 아주 멋진 트릭 (불충분 한). – coderama

6

unnest 여기 불필요, 간단한 배열 구성원에 대한 테스트에 참여 사용할 수 있습니다

SELECT people."ID", people."PERSON", groups."ID" 
FROM people 
INNER JOIN groups ON groups."ID" = ANY (people."GROUPS") 
ORDER BY people."ID", groups."ID"; 

참조 : http://sqlfiddle.com/#!12/5fa34/7

(이상한 대문자 왜냐하면 SQLFiddle의 일관되지 않은 식별자 인용 부호를 고치지 않아도되기 때문입니다. 열 이름은 인용하지만 테이블 이름은 인용하지 않습니다.

요 심지어 people.GROUPS에 GIN 인덱스를 사용하고 인덱스 된 조인을 얻을 수도 있습니다. GIN 지수는 구축하기가 저렴하지 않고 업데이트하는 데 많은 비용이 들기 때문에 실제로 필요할 때만 수행하고 싶지만 유용합니다. 배열 색인에 대한 설명서를 참조하십시오. 예 :

CREATE INDEX people_groups_gin_idx ON people USING GIN("GROUPS"); 

SELECT people."ID", people."PERSON", groups."ID" 
FROM people 
INNER JOIN groups ON ARRAY[groups."ID"] @> people."GROUPS" 
ORDER BY people."ID", groups."ID"; 
관련 문제