साफ सेटअप:
CREATE TABLE tbl (
given_date date
, set_name varchar
);
एकल . के लिए स्तंभ नाम के रूप में एकवचन शब्द का प्रयोग करें value.
डेटा प्रकार स्पष्ट रूप से date
है न कि timestamp
।
अपने टेक्स्ट पैरामीटर को उपयोगी तालिका में बदलने के लिए:
SELECT unnest(string_to_array('2001-01-01to2001-01-05,2001-01-10to2001-01-15', ',')) AS date_range
, unnest(string_to_array('s1,s2', ',')) AS set_name;
"समानांतर unnest" आसान है, लेकिन इसकी चेतावनी है। पोस्टग्रेज 9.4 एक स्वच्छ समाधान जोड़ता है, पोस्टग्रेस 10 अंततः इस के व्यवहार को साफ कर दिया। नीचे देखें।
गतिशील निष्पादन
तैयार स्टेटमेंट
तैयार बयान केवल निर्माण सत्र के लिए दृश्यमान होते हैं और इसके साथ मर जाते हैं। प्रति दस्तावेज़:
<ब्लॉकक्वॉट>तैयार किए गए विवरण केवल वर्तमान डेटाबेस सत्र की अवधि के लिए ही चलते हैं।
PREPARE
प्रति सत्र एक बार :
PREPARE upd_tbl AS
UPDATE tbl t
SET set_name = s.set_name
FROM (
SELECT unnest(string_to_array($1, ',')) AS date_range
, unnest(string_to_array($2, ',')) AS set_name
) s
WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
AND split_part(date_range, 'to', 2)::date;
या विवरण तैयार करने के लिए अपने क्लाइंट द्वारा प्रदान किए गए टूल का उपयोग करें।
मनमाने मापदंडों के साथ n बार निष्पादित करें:
EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');
सर्वर-साइड फ़ंक्शन
कार्य कायम हैं और सभी के लिए दृश्यमान हैं सत्र।
CREATE FUNCTION
एक बार :
CREATE OR REPLACE FUNCTION f_upd_tbl(_date_ranges text, _names text)
RETURNS void AS
$func$
UPDATE tbl t
SET set_name = s.set_name
FROM (
SELECT unnest(string_to_array($1, ',')) AS date_range
, unnest(string_to_array($2, ',')) AS set_name
) s
WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
AND split_part(date_range, 'to', 2)::date
$func$ LANGUAGE sql;
n बार कॉल करें:
SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');
एसक्यूएल फिडल
बेहतर डिज़ाइन
सरणी पैरामीटर का उपयोग करें (अभी भी स्ट्रिंग अक्षर के रूप में प्रदान किया जा सकता है), एक daterange
टाइप करें (दोनों पृष्ठ 9.3) और नया समानांतर unnest()
(पृष्ठ 9.4 )।
CREATE OR REPLACE FUNCTION f_upd_tbl(_dr daterange[], _n text[])
RETURNS void AS
$func$
UPDATE tbl t
SET set_name = s.set_name
FROM unnest($1, $2) s(date_range, set_name)
WHERE t.given_date <@ s.date_range
$func$ LANGUAGE sql;
<@
"तत्व द्वारा निहित है" ऑपरेटर होने के नाते।
कॉल करें:
SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
,"[2001-01-20,2001-01-25]"}', '{s2,s5}');
विवरण:
- एकाधिक सरणियों को समानांतर में अननेस्ट करें