HAVING
. में समग्र फ़ंक्शन का उपयोग करना खंड बहुत अधिक कानूनी है, क्योंकि HAVING
समूह पंक्तियों को हटा देता है। सशर्त गणना या तो उस संपत्ति का उपयोग करके प्राप्त की जा सकती है जो NULL
. है गिनती नहीं है:
count(expression)
... इनपुट पंक्तियों की संख्या जिसके लिए व्यंजक का मान शून्य नहीं है
या अगर PostgreSQL 9.4 या बाद के संस्करण का उपयोग कर रहे हैं, तो कुल FILTER
. के साथ खंड:
count(*) FILTER (WHERE something > 0)
आप योग के योग (और शून्य) का भी उपयोग कर सकते हैं।
PostgreSQL>=9.4 और SQLAlchemy>=1.0.0
फ़िल्टर किए गए समग्र फ़ंक्शन का उपयोग करना:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
पुराना PostgreSQL और/या SQLAlchemy
"if" के लिए SQL एनालॉग या तो CASE
. है अभिव्यक्ति या इस मामले में nullif()
समारोह। इन दोनों का उपयोग इस तथ्य के साथ किया जा सकता है कि NULL
गिनती नहीं है:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
या:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
nullif()
का उपयोग करना थोड़ा भ्रमित करने वाला हो सकता है क्योंकि "हालत" वही है जो आप नहीं करते हैं गिनना चाहते हैं। आप एक ऐसी अभिव्यक्ति बना सकते हैं जो स्थिति को और अधिक प्राकृतिक बना दे, लेकिन यह पाठक के लिए छोड़ दिया गया है। ये 2 अधिक पोर्टेबल समाधान हैं, लेकिन दूसरी ओर FILTER
खंड मानक है, हालांकि व्यापक रूप से उपलब्ध नहीं है।