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

पूरे डेटाबेस में खाली स्ट्रिंग्स ('') को NULL पर सेट करें

इसे हासिल करने का सबसे कारगर तरीका:

  • एकल UPDATE चलाएं प्रति टेबल।
  • केवल अशक्त कॉलम अपडेट करें (परिभाषित नहीं NOT NULL ) किसी भी वास्तविक खाली स्ट्रिंग के साथ।
  • केवल वास्तविक रिक्त स्ट्रिंग वाली पंक्तियों को अपडेट करें।
  • अन्य मानों को अपरिवर्तित रहने दें।

इस संबंधित उत्तर में एक plpgsql फ़ंक्शन है जो UPDATE . बनाता और चलाता है सिस्टम कैटलॉग का उपयोग कर कमांड pg_attribute किसी भी तालिका के लिए स्वचालित रूप से और सुरक्षित रूप से:

  • खाली स्ट्रिंग्स को रिक्त मानों से बदलें

फ़ंक्शन का उपयोग करना f_empty2null() इस उत्तर से, आप इस तरह से चयनित तालिकाओं के माध्यम से लूप कर सकते हैं:

DO
$do$
DECLARE
   _tbl regclass;
BEGIN
   FOR _tbl IN
      SELECT c.oid::regclass
      FROM   pg_class c
      JOIN   pg_namespace n ON n.oid = c.relnamespace
      WHERE  c.relkind = 'r'            -- only regular tables
      AND    n.nspname NOT LIKE 'pg_%'  -- exclude system schemas
   LOOP
      RAISE NOTICE $$PERFORM f_empty2null('%');$$, _tbl;
      -- PERFORM f_empty2null(_tbl);  -- uncomment to prime the bomb
   END LOOP;
END
$do$;

सावधान! यह डीबी में सभी उपयोगकर्ता तालिकाओं के सभी कॉलम में सभी खाली तारों को अद्यतन करता है। सुनिश्चित करें कि आप यही चाहते हैं या यह आपके डेटाबेस को न्यूक कर सकता है।

आपको UPDATE की आवश्यकता है निश्चित रूप से सभी चयनित तालिकाओं पर विशेषाधिकार।

बाल सुरक्षा उपकरण के रूप में मैंने पेलोड पर टिप्पणी की।

आपने ध्यान दिया होगा कि मैं सीधे सिस्टम कैटलॉग का उपयोग करता हूं, न कि सूचना स्कीमा (जो काम करेगा, भी)। इसके बारे में:

  • किसी दिए गए स्कीमा में तालिका मौजूद है या नहीं, इसकी जांच कैसे करें
  • किसी क्वेरी, तालिका या दृश्य के आउटपुट कॉलम नाम और डेटा प्रकार वापस करने के लिए क्वेरी

बार-बार इस्तेमाल के लिए

बार-बार उपयोग के लिए यहां एक एकीकृत समाधान है। सुरक्षा उपकरणों के बिना:

CREATE OR REPLACE FUNCTION f_all_empty2null(OUT _tables int, OUT _rows int) AS
$func$
DECLARE
   _typ CONSTANT regtype[] := '{text, bpchar, varchar, \"char\"}';
   _sql text;
   _row_ct int;
BEGIN
   _tables := 0;  _rows := 0;
   FOR _sql IN
      SELECT format('UPDATE %s SET %s WHERE %s'
                  , t.tbl
                  , string_agg(format($$%1$s = NULLIF(%1$s, '')$$, t.col), ', ')
                  , string_agg(t.col || $$ = ''$$, ' OR '))
      FROM  (
         SELECT c.oid::regclass AS tbl, quote_ident(attname) AS col
         FROM   pg_namespace n
         JOIN   pg_class     c ON c.relnamespace = n.oid
         JOIN   pg_attribute a ON a.attrelid = c.oid
         WHERE  n.nspname NOT LIKE 'pg_%'   -- exclude system schemas
         AND    c.relkind = 'r'             -- only regular tables
         AND    a.attnum >= 1               -- exclude tableoid & friends
         AND    NOT a.attisdropped          -- exclude dropped columns
         AND    NOT a.attnotnull            -- exclude columns defined NOT NULL!
         AND    a.atttypid = ANY(_typ)      -- only character types
         ORDER  BY a.attnum
         ) t
      GROUP  BY t.tbl
   LOOP
      EXECUTE _sql;
      GET DIAGNOSTICS _row_ct = ROW_COUNT;  -- report nr. of affected rows
      _tables := _tables + 1;
      _rows := _rows + _row_ct;
   END LOOP;
END
$func$  LANGUAGE plpgsql;

कॉल करें:

SELECT * FROM pg_temp.f_all_empty2null();

रिटर्न:

 _tables | _rows
---------+---------
 23      | 123456

नोट मैं टेबल और कॉलम दोनों नामों से कैसे बच गया!

c.oid::regclass AS tbl, quote_ident(attname)  AS col

विचार करें:

  • तालिका नाम PostgreSQL फ़ंक्शन पैरामीटर के रूप में

सावधान! ऊपर की तरह ही चेतावनी।
ऊपर दिए गए उत्तर में मूल स्पष्टीकरण पर भी विचार करें:

  • खाली स्ट्रिंग्स को रिक्त मानों से बदलें


  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 11 . में PL/Java 1.5.2 स्थापित करें

  2. पीएल/पीजीएसक्यूएल फ़ंक्शन में चयन करें या निष्पादित करें

  3. PostgreSQL पर एक सशर्त अद्वितीय अनुक्रमणिका कैसे जोड़ें

  4. Psycopg2 . का उपयोग करके पायथन डिक्शनरी डालें

  5. मैं postgresql फ़ंक्शन का उपयोग करके अलग-अलग तालिका नाम से डेटा प्राप्त करना चाहता हूं