2016-08-24 21 views
1

我在Postgres上執行了查詢,並使用了Postgres 9.4或更高版本中提供的FILTER子句,但我被告知只能使用標準SQL子句。在Postgres上更改查詢以僅使用標準SQL子句

我的查詢是如何計算有多少動物被屠宰,屠宰動物的數量將被顯示爲每個企業和動物類型:

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標準的一部分。當涉及SQL功能或SQL標準時,MySQL幾乎不是基準。如果你想要一個在Postgres **和** MySQL上運行的語句,那麼你不應該請求一個「標準的SQL」語句。 –

回答

2

如果我理解正確的是如何filter作品,這可以通過使用case表達count函數內部翻譯:

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,或者沒有第二個參數時使用​​3210。