GROUP BY
. में और ORDER BY
क्लॉज आप कॉलम एलियासेस (आउटपुट कॉलम) या यहां तक कि SELECT
. के ऑर्डिनल नंबर का भी उल्लेख कर सकते हैं सामान सूचि। मैं ORDER BY
. पर मैनुअल उद्धृत करता हूं :
प्रत्येक व्यंजक एक आउटपुट कॉलम का नाम या क्रमांक संख्या हो सकता है(सूची आइटम चुनें) , या यह इनपुट-कॉलम मानों से निर्मित एक मनमाना व्यंजक हो सकता है।
बोल्ड जोर मेरा।
लेकिन WHERE
. में और HAVING
क्लॉज, आप केवल बेस टेबल (इनपुट कॉलम) से कॉलम का उल्लेख कर सकते हैं, इसलिए आपको अपने फंक्शन कॉल को स्पेल करना होगा।
SELECT *, earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM venues
WHERE earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) <= radius
ORDER BY distance;
यदि आप जानना चाहते हैं कि सीटीई या सबक्वेरी में गणना को पैक करना तेज़ है या नहीं, तो बस इसे EXPLAIN ANALYZE
के साथ जांचें। . (मुझे शक है।)
SELECT *
FROM (
SELECT *
,earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM venues
) x
WHERE distance <= radius
ORDER BY distance;
जैसे @Mike ने एक फंक्शन STABLE
. घोषित करके कमेंट किया (या IMMUTABLE
) आप क्वेरी प्लानर को सूचित करते हैं कि फ़ंक्शन कॉल के परिणाम एक ही स्टेटमेंट में समान कॉल के लिए कई बार पुन:उपयोग किए जा सकते हैं। मैं यहां मैनुअल को उद्धृत करता हूं:
एक स्थिर फ़ंक्शन डेटाबेस को संशोधित नहीं कर सकता है और एक ही कथन के भीतर सभी पंक्तियों के लिए समान तर्क दिए गए समान परिणामों को वापस करने की गारंटी है। यह श्रेणी ऑप्टिमाइज़र को फ़ंक्शन की एक से अधिक कॉल को एक कॉल के लिए अनुकूलित करने की अनुमति देती है ।
बोल्ड जोर मेरा।