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

WHERE क्लॉज का उपयोग करके स्टेटमेंट अपडेट करें जिसमें शून्य मान वाले कॉलम हों

चूंकि null =null गलत . का मूल्यांकन करता है आपको यह जांचना होगा कि क्या दो फ़ील्ड दोनों null हैं समानता जांच के अलावा:

UPDATE table_one SET table_one.x = table_two.y 
FROM table_two
WHERE 
    (table_one.invoice_number = table_two.invoice_number 
        OR (table_one.invoice_number is null AND table_two.invoice_number is null))
    AND
    (table_one.submitted_by = table_two.submitted_by 
        OR (table_one.submitted_by is null AND table_two.submitted_by is null))
    AND 
    -- etc

आप <कोड का भी उपयोग कर सकते हैं>मिश्रित फ़ंक्शन जो अधिक पठनीय है:

UPDATE table_one SET table_one.x = table_two.y 
FROM table_two
WHERE 
    coalesce(table_one.invoice_number, '') = coalesce(table_two.invoice_number, '')
    AND coalesce(table_one.submitted_by, '') = coalesce(table_two.submitted_by, '')
    AND -- etc

लेकिन आपको डिफ़ॉल्ट मानों के बारे में सावधान रहने की आवश्यकता है (coalesce . के लिए अंतिम तर्क ).
इसका डेटा प्रकार कॉलम प्रकार से मेल खाना चाहिए (ताकि आप उदाहरण के लिए तिथियों की तुलना संख्याओं से न करें) और डिफ़ॉल्ट ऐसा होना चाहिए कि यह डेटा में दिखाई न दे
उदा. coalesce(null, 1) =coalesce(1, 1) ऐसी स्थिति है जिससे आप बचना चाहेंगे।

अपडेट (प्रदर्शन के संबंध में):

table_two पर Seq स्कैन - इससे पता चलता है कि आपके पास table_two . पर कोई अनुक्रमणिका नहीं है .
इसलिए यदि आप table_one . में एक पंक्ति को अपडेट करते हैं फिर table_two . में एक मेल खाने वाली पंक्ति खोजने के लिए डेटाबेस को मूल रूप से सभी पंक्तियों को एक-एक करके तब तक स्कैन करना होता है जब तक कि उसे एक मिलान नहीं मिल जाता।
यदि संबंधित कॉलम अनुक्रमित किए गए थे, तो मेल खाने वाली पंक्तियों को बहुत तेज़ी से पाया जा सकता है।

दूसरी तरफ अगर table_one कोई अनुक्रमणिका है जो अद्यतन को धीमा कर देती है।
के अनुसार यह प्रदर्शन मार्गदर्शिका :

उसी गाइड का एक और सुझाव जो मददगार हो सकता है:

तो उदाहरण के लिए यदि table_one एक आईडी कॉलम आप कुछ इस तरह जोड़ सकते हैं

and table_one.id between x and y

कहां . तक हालत और क्वेरी को कई बार x . के मानों को बदलते हुए चलाएँ और वाई ताकि सभी पंक्तियों को कवर किया जा सके।

ANALYZE . का उपयोग करते समय आप शायद सावधान रहना चाहें EXPLAIN . के साथ विकल्प साइड इफेक्ट के साथ बयानों से निपटने के दौरान। दस्तावेज़ीकरण के अनुसार :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेएसक्यूएल बी-ट्री इंडेक्स पर नोट्स

  2. बल्क इंसर्ट/अपडेट को पोस्टग्रेज करता है जो इंजेक्शन-सुरक्षित है। शायद एक फ़ंक्शन जो एक सरणी लेता है?

  3. SQL इन-डीबी संचालन के लिए dplyr का उपयोग करते समय ifelse और grep कमांड

  4. PostgreSQL क्वेरी (इसे चलाए बिना) से कॉलम नाम और प्रकार कैसे प्राप्त करें?

  5. माइक्रोनॉट yml . में डीबी से कनेक्ट नहीं हो रहा है