2017-11-10 72 views
7

Vì vậy, tôi gặp phải những gì tôi nghĩ là một lỗi kỳ lạ sáng nay khi tôi vô tình gọi một cột "đếm" không tồn tại trong CTE của tôi. Postgres đang tìm kiếm một mệnh đề GROUP BY mặc dù tôi không nghĩ rằng tôi đang làm tổng hợp. Chơi nhiều hơn một chút và nó xuất hiện table.count tương đương với một hàm đếm sao. Hãy xem xét những điều sau đây:Đếm Cú pháp Đếm Dot Tổng hợp (.count)

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

này sẽ tạo ra kết quả mà trông như thế này trong bộ dữ liệu của tôi:

enter image description here

Bị kích thích để hiểu những gì các quy tắc cú pháp thực tế Postgres là, tôi đã cố gắng tìm kiếm tài liệu để tham khảo với cú pháp này và không thể tìm thấy bất cứ điều gì; chỉ rất nhiều tài liệu để đếm (*). Bất cứ ai có thể giải thích nếu đây là SQL hợp lệ và liệu có các chức năng tổng hợp khác cũng có thể được gọi tương tự? Liên kết đến tài liệu Postgres sẽ tuyệt vời nếu chúng tồn tại.

Lưu ý. Đây là trên Postgres 9.5.9

+0

đây không phải là tiêu chuẩn sql – Hogan

+0

cách chính xác được bạn chế biến sql này - là nó có thể ứng dụng truy vấn của bạn đang thực hiện thay đổi đối với bạn? – Hogan

+0

Vâng, tôi có thể xác nhận hành vi này. – jira

Trả lời

9

Đó là cú pháp Postgres hợp lệ vì trong Postgres một hàm với đối số duy nhất phù hợp với một loại bảng có thể được gọi bằng hai cách khác nhau:

Giả sử một tên bảng foo và một chức năng tên some_function với một đối số duy nhất của loại hình foo thì sau đây:

select some_function(f) 
from foo f; 

tương đương với

select f.some_function 
from foo f; 

Các bí danh là thực sự không cần thiết:

select foo.some_function 
from foo; 

Đây là một kết quả của sự "hướng đối tượng" Cấu trúc của Postgres.

count() có thể mất bất kỳ đối số - bao gồm một tham chiếu liên tiếp (= record) do đó

select count(f) 
from foo f; 

tương đương với

select f.count 
from foo f; 

này được diễn tả trong chương về Function Calls trong cuốn hướng dẫn:

Một hàm lấy một đối số duy nhất của loại kết hợp có thể opti được gọi bằng cách sử dụng cú pháp lựa chọn trường, và lựa chọn trường ngược lại có thể được viết theo kiểu chức năng. Nghĩa là, các ký hiệu col (bảng) và table.col có thể hoán đổi cho nhau. Hành vi này không phải là chuẩn SQL nhưng được cung cấp trong PostgreSQL vì nó cho phép sử dụng các hàm để mô phỏng các trường được tính toán. Để biết thêm thông tin, xem Section 8.16.5.

+2

Wow.Câu trả lời chính xác. –

+0

Tôi bị ném bằng cách nghĩ đây chỉ là cú pháp hàm đếm. Tôi thậm chí không nghĩ đến việc xem qua tài liệu gọi hàm chung. THanks – Daniel

+0

Ít nhất tôi đã đúng về nó không phải là chuẩn sql. – Hogan

Các vấn đề liên quan