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

Postgres . में डायनामिक क्वेरी + उपयोगकर्ता परिभाषित डेटाटाइप का उपयोग करना

मूल UPDATE

पहली क्वेरी को इस बहुत छोटे और अधिक कुशल एकल UPDATE . से बदलें आदेश:

UPDATE features
SET   (x1,x2,x3,x4,x5,x6, y)   
    = ((x1 - g.avg1) / g.range1
     , (x2 - g.avg2) / g.range2
 --  , (x3 - ...
     , (y  - g.avgy) / g.rangey)
FROM (
   SELECT avg(x1) AS avg1, max(x1) - min(x1) AS range1
        , avg(x2) AS avg2, max(x2) - min(x2) AS range2
     -- , avg(x3) ...
        , avg(y) AS avgy, max(y) - min(y) AS rangey
   FROM   features
   ) g;

संक्षिप्त UPDATE के बारे में वाक्य रचना:

डायनामिक फ़ंक्शन

सरल क्वेरी पर निर्माण, यहां किसी भी संख्या में कॉलम के लिए एक गतिशील कार्य है:

CREATE OR REPLACE FUNCTION scale_function_dyn()
  RETURNS void AS
$func$
DECLARE
   cols text;  -- list of target columns
   vals text;  -- list of values to insert
   aggs text;  -- column list for aggregate query
BEGIN
   SELECT INTO cols, vals, aggs
          string_agg(quote_ident(attname), ', ')
        , string_agg(format('(%I - g.%I) / g.%I'
                          , attname, 'avg_' || attname, 'range_' || attname), ', ')
        , string_agg(format('avg(%1$I) AS %2$I, max(%1$I) - min(%1$I) AS %3$I'
                          , attname, 'avg_' || attname, 'range_' || attname), ', ')
   FROM   pg_attribute
   WHERE  attrelid = 'features'::regclass
   AND    attname NOT IN ('n', 'x0')  -- exclude columns from update
   AND    NOT attisdropped            -- no dropped (dead) columns
   AND    attnum > 0;                 -- no system columns

   EXECUTE format('UPDATE features
                   SET   (%s) = (%s)
                   FROM  (SELECT %s FROM features) g'
                 , cols, vals, aggs);

END
$func$  LANGUAGE plpgsql;

अधिक स्पष्टीकरण के साथ संबंधित उत्तर:

SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस में अपडेट के बाद रेल कोड चलाएँ, बिना after_commit

  2. पीडीओ बनाम पीजी_* कार्य

  3. सरणी प्रकार की उपयोगिता क्या है?

  4. पोस्टग्रेज जहां क्लॉज टाइमस्टैम्प की तुलना करता है

  5. मूल क्वेरी के लिए दिनांक पैरामीटर पास करें