PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

plpgsql फ़ंक्शन में डायनामिक ऑर्डर BY और ASC / DESC

मैं इसे इस तरह से करूंगा:

CREATE OR REPLACE FUNCTION list(
      _category varchar(100)
    , _limit int
    , _offset int
    , _order_by varchar(100)
    , _order_asc_desc text = 'ASC')  -- last param with default value
  RETURNS TABLE(id int, name varchar, clientname varchar, totalcount bigint)
  LANGUAGE plpgsql AS
$func$
DECLARE
   _empty text := '';
BEGIN
   -- Assert valid _order_asc_desc
   IF upper(_order_asc_desc) IN ('ASC', 'DESC', 'ASCENDING', 'DESCENDING') THEN
      -- proceed
   ELSE
      RAISE EXCEPTION 'Unexpected value for parameter _order_asc_desc.
                       Allowed: ASC, DESC, ASCENDING, DESCENDING. Default: ASC';
   END IF;
   
   RETURN QUERY EXECUTE format(
     'SELECT id, name, clientname, count(*) OVER() AS full_count
      FROM   design_list
      WHERE ($1 = $2 OR category ILIKE $1) 
      ORDER  BY %I %s
      LIMIT  %s
      OFFSET %s'
    , _order_by, _order_asc_desc, _limit, _offset)
   USING _category, _empty;
END
$func$;

मुख्य विशेषता:format() अपनी क्वेरी स्ट्रिंग को सुरक्षित और सुंदर ढंग से संयोजित करने के लिए। संबंधित:

ASC / DESC (या ASCENDING / DESCENDING ) निश्चित कुंजी शब्द हैं। मैंने मैन्युअल जांच जोड़ी (IF ... ) और बाद में एक साधारण %s . के साथ संयोजित करें . वह एक है कानूनी इनपुट का दावा करने का तरीका। सुविधा के लिए, मैंने अनपेक्षित इनपुट और पैरामीटर डिफ़ॉल्ट के लिए एक त्रुटि संदेश जोड़ा है, इसलिए फ़ंक्शन डिफ़ॉल्ट रूप से ASC पर है यदि कॉल में अंतिम पैरामीटर छोड़ा गया है। संबंधित:

संबोधित करना टिप्पणी , मैं संयोजित करता हूं _limit और _offset सीधे, इसलिए क्वेरी पहले से ही उन पैरामीटर के साथ नियोजित है।

_limit और _offset integer हैं पैरामीटर, इसलिए हम सादे %s . का उपयोग कर सकते हैं एसक्यूएल इंजेक्शन के खतरे के बिना। संयोजन करने से पहले आप उचित मूल्यों (नकारात्मक मूल्यों और बहुत अधिक मूल्यों को छोड़कर) पर जोर देना चाह सकते हैं ...

अन्य नोट:
  • एक सुसंगत नामकरण सम्मेलन का प्रयोग करें। मैंने सभी पैरामीटर और वैरिएबल को अंडरस्कोर _ . के साथ प्रीफ़िक्स किया है , न केवल कुछ

  • EXECUTE . के अंदर तालिका योग्यता का उपयोग नहीं कर रहा है , क्योंकि इसमें केवल एक ही तालिका शामिल है और EXECUTE इसका अलग दायरा है।

  • मैंने स्पष्ट करने के लिए कुछ मापदंडों का नाम बदल दिया। _order_by _sort_by . के बजाय; _order_asc_desc _order . के बजाय ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. किसी भी कंप्यूटर से Postgresql तक पहुँच की अनुमति दें

  2. मैं PostgreSQL 11.1 में मौजूदा कॉलम को पहचान के रूप में कैसे बदल सकता हूं?

  3. मैं psycopg और gevent का उपयोग करके कनेक्शन कैसे पूल कर सकता हूं?

  4. मेरे क्वेरीसेट ओबीजे को पैरामीटर के रूप में पास करते समय अजवाइन त्रुटि उठाता है

  5. Django डेटटाइम फ़ील्ड टाइमज़ोन के बिना टाइमस्टैम्प फ़ील्ड उत्पन्न करने के लिए