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

कॉलम में पार्सिंग पाइप सीमांकित स्ट्रिंग?

आप regexp_substr का उपयोग कर सकते हैं (10g+):

SQL> SELECT regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 1) c1,
  2         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 2) c2,
  3         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 3) c3
  4    FROM dual;

C1 C2   C3
-- ---- ----
23 12.1  450

PL/SQL में लूप के साथ:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     p_tsv  VARCHAR2(1000) := '23|12.1| 450|30|9|78|82.5|92.1|120|185|52|11';
  3     l_item VARCHAR2(100);
  4  BEGIN
  5     FOR i IN 1 .. length(p_tsv) - length(REPLACE(p_tsv, '|', '')) + 1 LOOP
  6        l_item := regexp_substr(p_tsv, '[^|]+', 1, i);
  7        dbms_output.put_line(l_item);
  8     END LOOP;
  9  END;
 10  /

23
12.1
450
30
9
78
82.5
92.1
120
185
52
11

PL/SQL procedure successfully completed

अपडेट करें

आप केवल 12 कॉलम हैं, मैं एक लूप के बिना सीधे क्वेरी लिखूंगा, यह गतिशील एसक्यूएल की तुलना में अधिक प्रदर्शन करने वाला और आसान होगा (लिखने के लिए असीम रूप से आसान नहीं है):

INSERT INTO your_table
   (ID, month1, month2, month3...)
   SELECT :p_id, 
          regexp_substr(:p_tsv, '[^|]+', 1, 1) c1, 
          regexp_substr(:p_tsv, '[^|]+', 1, 2) c2,
          regexp_substr(:p_tsv, '[^|]+', 1, 3) c3
          ...
     FROM dual;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle D2k फॉर्म 6i . में एक फॉर्म स्क्रीन को रिफ्रेश / अपडेट करना

  2. देशी गतिशील एसक्यूएल का उपयोग करके निष्पादित किए गए चयन कथन का परिणाम कैसे आउटपुट करें?

  3. Oracle शीर्ष 10 रिकॉर्ड चुनें

  4. Oracle बल्क कलेक्ट उदाहरण कर्सर रोटाइप टाइप ऑब्जेक्ट का उपयोग कर रहा है

  5. OracleCommand SQL पैरामीटर्स बाइंडिंग