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

दिए गए स्ट्रिंग को विभाजित करें और केस स्टेटमेंट तैयार करें

साफ सेटअप:

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}');

विवरण:

  • एकाधिक सरणियों को समानांतर में अननेस्ट करें


  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. PostgreSQL सर्वर मैक ओएस एक्स की स्थिति की जांच कैसे करें

  3. पोस्टग्रेस सरणी में डेटा का चयन करना

  4. Postgresql में एक विशिष्ट कॉलम वाली तालिका कैसे खोजें?

  5. PostgreSQL में 'उपयोगकर्ता' नाम की डेटाबेस तालिका नहीं बना सकता