2012-11-09 24 views
18

है मैं इस तरह एक प्रश्न (एक समारोह में):स्तंभ अद्यतन नहीं करते हैं अद्यतन मान शून्य

UPDATE some_table SET 
    column_1 = param_1, 
    column_2 = param_2, 
    column_3 = param_3, 
    column_4 = param_4, 
    column_5 = param_5 
WHERE id = some_id; 

कहाँ param_x मेरी समारोह की एक पैरामीटर है। क्या उन कॉलम को अपडेट करने का कोई तरीका नहीं है, जिसके लिए परम NULL है? उदाहरण के लिए - यदि param_4 और param_5NULL हैं, तो केवल पहले तीन कॉलम अपडेट करें और column_4 और column_5 के लिए पुराने मान छोड़ दें।

तरह से मैं अब यह कर रहा हूँ है:

SELECT * INTO temp_row FROM some_table WHERE id = some_id; 

UPDATE some_table SET 
    column_1 = COALESCE(param_1, temp_row.column_1), 
    column_2 = COALESCE(param_2, temp_row.column_2), 
    column_3 = COALESCE(param_3, temp_row.column_3), 
    column_4 = COALESCE(param_4, temp_row.column_4), 
    column_5 = COALESCE(param_5, temp_row.column_5) 
WHERE id = some_id; 

वहाँ एक बेहतर तरीका है?

+0

मुझे लगता है कि जाने के लिए रास्ता नहीं है। –

उत्तर

39

SELECT कथन ड्रॉप कोई जरूरत के लिए, बस वर्तमान मूल्य का उपयोग नहीं है,:,

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2), 
    column_3 = COALESCE(param_3, column_3), 
    column_4 = COALESCE(param_4, column_4), 
    column_5 = COALESCE(param_5, column_5) 
WHERE id = some_id; 
8

इसके अतिरिक्त खाली अपडेट से बचने के लिए:

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2) 
    ... 
WHERE id = some_id; 
AND (param_1 IS DISTINCT FROM column_1 OR 
     param_2 IS DISTINCT FROM column_2 OR 
     ... 
    ); 
10

साफ चाल, धन्यवाद Przemek, फ्रैंक & इरविन!

मैं खाली अपडेट से बचने के लिए इरविन के उत्तर में मामूली संपादन का सुझाव देता हूं। यदि कोई पैरामीटर शून्य था (जिसका अर्थ है: "पुराने मान का उपयोग करें"), पंक्ति को हर बार अद्यतन किया गया था, भले ही पंक्ति मान नहीं बदला गया था (पहले अद्यतन के बाद)।

जोड़ने "param_x शून्य नहीं है" के द्वारा, हम खाली अपडेट से बचने:

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2), 
    ... 
WHERE id = some_id 
AND (param_1 IS NOT NULL AND param_1 IS DISTINCT FROM column_1 OR 
     param_2 IS NOT NULL AND param_2 IS DISTINCT FROM column_2 OR 
    ... 
); 
+2

ठीक है, यह भी बेहतर है। यदि सभी शामिल कॉलम को 'नॉट नल' परिभाषित किया गया है, तो मेरा संस्करण पैरामीटर में पहले से ही NULL को कवर करता है। किसी मामले के लिए असंभव नहीं है, जहां OP अद्यतन में नए नल मानों को अस्वीकार करता है। –