2013-06-26 5 views
1

나는 다음과 같은 두 개의 테이블했습니다 :에만 가입

tag 테이블 (영어로만 태그) :

ID title 
------------- 
1  tag_1 
2  tag_2 
3  tag_3 

tag_translation 표 :

ID title  locale tag_id (foreign key) 
----------------------------------------------- 
1  tag_1_fr FR  1 
2  tag_1_de DE  1 
3  tag_2_es ES  3 

어떻게 할을 프랑스어로 된 모든 태그를 반환하는 SQL 쿼리와 프랑스어로 태그가 발견되지 않으면 영어로 대체합니까?

결과의 예 (프랑스어에 모든 태그를 선택 영어로 폴백) :

ID title 
--------------- 
1  tag_1_fr 
2  tag_2 
3  tag_3 
+0

예가 잘못 되었습니까? 두 번째 세트의 두 번째 tag_id를 1로 설정해야합니까? –

+0

@Goat_CO 당신이 맞습니다. –

+0

영어가 모든 태그에 대해 영어가 존재하지만 번역 표에 없습니까? –

답변

6
SELECT T.ID 
     ,COALESCE(TT.TITLE, T.TITLE) AS TITLE 
FROM tag T 
LEFT JOIN tag_translation TT 
    ON T.ID = TT.tag_id 
    AND TT.locale = 'FR'; 

이것은 tag_id 및 로케일이 tag_translation에 고유 한 것으로 가정합니다.

+1

데모 : http://sqlfiddle.com/#!1/cb703/3/0 –

3

CASE 표현식이 시도 :

SELECT 
    T.ID, 
    CASE 
     WHEN TT.locale IS NOT NULL AND TT.locale = 'FR' THEN TT.title 
     ELSE t.title 
    END title 
FROM tag T LEFT JOIN tag_translation TT ON T.ID = TT.tag_id 
+0

여러 개의 번역 태그가있는 경우 [this fiddle] (http://sqlfiddle.com/#!1/66ed2/1)과 같이 중복이있을 수 있습니다. 태그 1은 영어와 독일어로 번역되어 있으며, 이것은 태그 1에 3 행을 표시합니다. 이것은 AND TT.locale = 'FR ''을 조인 조건으로 옮겨서 해결할 수 있습니다 (http://sqlfiddle.com/#!1/66ed2/2) – GarethD

+0

@Yuck'CASE WHEN' 대신'COALESCE'를 사용하는 것이 더 쉽습니다. 'TT.locale = 'FR''을 조인 조건으로 옮길 필요가있다. –

2

COALESCE 당신이 계신 당신을 얻을 것이다.

drop table if exists tag, tag_translation; 

create table tag (
id int primary key, 
title text 
); 

insert into tag values (1,'tag_1'), (2, 'tag_2'), (3, 'tag_3'); 

create table tag_translation (
id  int, 
title text, 
locale text, 
tag_id int references tag (id) 
); 

insert into tag_translation values 
(1,'tag_1_fr', 'FR', 1), 
(2,'tag_1_de', 'DE', 1), 
(3,'tag_2_es', 'ES', 3); 


select id, coalesce(fr.title, en.title) as title 
from 
(select id, title from tag) as en 
left join (select id, title from tag_translation where locale = 'FR') as fr using (id) 


id | title 
----+---------- 
    1 | tag_1_fr 
    2 | tag_2 
    3 | tag_3 
+0

정말요?. 'COALESCE'는 어떻게 든 여기에서 사용할 수 있지만, 분명히 그의 문제를 해결하지 않을 것입니다. – Lamak

+2

@Lamak 문제를 풀기 위해'COALESCE'를 사용하는 대답을 봅니다. 그리고 정말로 그것을 해결합니다. –

+0

웃긴 ... 나는 Postgres가 마지막 쿼리에서 'id'가 모호하다는 것을 불평 할 것을 기대했을 것입니다 ... else +1. –