2016-08-24 5 views
1

Postgres에 대한 쿼리를 수행했으며 Postgres 9.4 이상에서 사용할 수있는 FILTER 절을 사용했지만 표준 SQL 절만 사용할 수 있다고 들었습니다.표준 SQL 절만 사용하도록 Postgres에서 쿼리 변경하기

Enterprise(id or name) || cow || sheep || chicken 
MacDonals    || 5 || 5 || 1  
Burguer King   || 7 || 4 || 2  
KFC     || 1 || 0 || 10  

그래서 내가 POSTGRES 9.4에 기본 쿼리를 만든 :

내 쿼리는 도살되어 얼마나 많은 동물 학살 동물의 양이 각 기업 및 동물 유형에 대해 표시 할 것입니다 계산에 관한 것입니다 :

SELECT e.name 
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='cow')) 
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='sheep')) 
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='chicken')) 
FROM enterprise e 
INNER JOIN animal_enterprise ae 
ON (ae.enterprise_id = e.id) 
INNER JOIN animal a 
ON (ae.animal_id=a.id) 
GROUP BY e.id 

그래서 각 유형의 동물에 대해 하위 쿼리를 시도했지만 제대로 작동하지 않습니다.

+1

그건 이미 표준 SQL –

+0

같았어요.하지만 Filter 절은 postgres 9.4 이상의 새로운 기능이고, mysql에서 이와 동등한 기능은 존재하지 않을 수도 있고 같은 방식으로 수행 될 수도 없습니다. 그런 다음 Case 절은 표준화 방식으로 쿼리를 작성하는 것이 더 적합합니다. – ruselli

+0

필터 절 ***은 SQL 표준의 *** 부분입니다. 그리고 MySQL은 SQL 기능이나 SQL 표준과 관련해서는 거의 벤치 마크가 아닙니다. Postgres ** 및 ** MySQL에서 실행되는 명령문을 원하면 "표준 SQL 전용"명령문을 요청해서는 안됩니다. –

답변

2

내가이이 count 기능 내부 case 식을 사용하여 번역 할 수있는 방법을 filter 작품을 제대로 이해하고 :

SELECT e.name 
    ,COUNT(case when a.type='cow' then 'X' end) as cow 
    ,COUNT(case when a.type='sheep' then 'X' end) as sheep 
    ,COUNT(case when a.type='chicken' then 'X' end) as chicken 
FROM enterprise e 
INNER JOIN animal_enterprise ae 
    ON ae.enterprise_id = e.id 
INNER JOIN animal a 
    ON ae.animal_id = a.id 
GROUP BY e.id, e.name 

내가 쿼리에 몇 가지 이상을 무시 p.id의 사용처럼 ?? 별칭 p이 정의되어 있지 않거나 두 번째 매개 변수없이 coalesce을 사용할 경우.