2017-11-10 196 views
7

Bu sabah CTE'mde yanlışlıkla olmayan bir "sayım" sütununa yanlışlıkla başvurduğumda tuhaf bir hata olduğunu düşündüğüm şeyi araştırdım. Bir grup yaptığımı düşünmese de Postgres GROUP BY cümlesi arıyordu. Etrafında biraz daha oynayın ve tablo görünür. Count bir sayı yıldız işlevine eşdeğerdir. Aşağıdaki düşünün: Bu benim veri kümesindeki şuna benzer sonuçlar üretecektirCount Agrega Nokta Sayımı Sözdizimi (.count)

SELECT 
    c.clinic_id, 
    c.count, 
    count(*) as count_star 
FROM clinic_member c 
GROUP BY 
c.clinic_id 
ORDER BY clinic_id; 

:

durumu merak enter image description here

fiili Postgres sözdizimi kuralların ne anlama ben referanslar belgelerine arama çalıştı bu sözdizimine ve hiçbir şey bulamadı; sayım için çok sayıda doküman (*). Bunun geçerli bir SQL olup olmadığını ve benzer şekilde çağrılabilecek başka birleşik işlevler olup olmadığını herkes anlatabilir mi? Postgres belgelerine olan bağlantılar mevcutsa harika olur.

Not. Bu Postgres üzerinde 9.5.9

+0

bu olduğunu görmüyor standart sql – Hogan

+0

bu sql işliyoruz tam olarak nasıl - mümkün sorgu uygulaması sizin için değişiklik yapıyor edilir? – Hogan

+0

Evet, bu davranışı doğrulayabilirim. – jira

cevap

9

Çünkü Postgres geçerli Postgres sözdizimi bir tablo tipi iki farklı şekilde çağrılabilir eşleşen tek argüman olan bir işlevi:

bir tablo adını foo ve bir işlevi varsayarsak aşağıdaki sonra tip foo bir tek argüman alan some_function adlı:

select some_function(f) 
from foo f; 

select f.some_function 
from foo f; 
eşdeğerdir

takma aslında gerekli değildir:

select foo.some_function 
from foo; 

Bu Postgres arasında "nesne yönelimli" yapısının bir sonucudur.

: bu yüzden

select count(f) 
from foo f; 

select f.count 
from foo f; 

Bu yaklaşık Function Calls kılavuzunu bölüm belgelenen eşdeğer bir satır referans (= kayıt) de dahil olmak üzere -

count() herhangi bir parametre sunar

Tek bir bileşik türü argümanını alan bir işlev saha seçimli sözdizimini kullanarak çağrılabilir ve tersine alan seçimi fonksiyonel tarzda yazılabilir. Yani, notasyon col (tablo) ve table.col birbirleriyle değiştirilebilir. Bu davranış, SQL standardı değildir, ancak PostgreSQL'te sağlanmıştır, çünkü işlevlerin “hesaplanan alanlar” u taklit etmesine izin verir. Daha fazla bilgi için Section 8.16.5.

+2

Vay.Mükemmel cevap. –

+0

Sadece bunun bir sayı fonksiyonu sözdizimi olduğunu düşünerek atıldım. Genel işlev çağrısı belgelerini incelemeyi bile düşünmedim. THanks – Daniel

+0

En azından standart sql olmama konusunda haklıydım. – Hogan