มีหลายตัวเลือก ดู แยกเดี่ยว สตริงที่คั่นด้วยเครื่องหมายจุลภาคเป็นแถวใน Oracle
คุณเพียงแค่ต้องเพิ่ม LEVEL ในรายการที่เลือกเป็นคอลัมน์ เพื่อรับหมายเลข ลำดับ สำหรับแต่ละแถวที่ส่งคืน หรือ ROWNUM ก็เพียงพอแล้วเช่นกัน
เมื่อใช้ SQL ด้านล่างนี้ คุณสามารถรวมไว้ใน FUNCTION ได้
INSTR ในส่วน เชื่อมต่อโดย:
SQL> WITH DATA AS
2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
3 )
4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
5 FROM DATA
6 CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0
7 /
STR
----------------------------------------
word1
word2
word3
word4
word5
word6
6 rows selected.
SQL>
REGEXP_SUBSTR ในส่วน เชื่อมต่อโดย:
SQL> WITH DATA AS
2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
3 )
4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
5 FROM DATA
6 CONNECT BY regexp_substr(str , '[^,]+', 1, LEVEL) IS NOT NULL
7 /
STR
----------------------------------------
word1
word2
word3
word4
word5
word6
6 rows selected.
SQL>
REGEXP_COUNT ในส่วน CONNECT BY:
SQL> WITH DATA AS
2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
3 )
4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
5 FROM DATA
6 CONNECT BY LEVEL
ใช้ XMLTABLE
SQL> WITH DATA AS
2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
3 )
4 SELECT trim(COLUMN_VALUE) str
5 FROM DATA, xmltable(('"' || REPLACE(str, ',', '","') || '"'))
6 /
STR
------------------------------------------------------------------------
word1
word2
word3
word4
word5
word6
6 rows selected.
SQL>
การใช้ MODEL ประโยค:
SQL> WITH t AS
2 (
3 SELECT 'word1, word2, word3, word4, word5, word6' str
4 FROM dual ) ,
5 model_param AS
6 (
7 SELECT str AS orig_str ,
8 ','
9 || str
10 || ',' AS mod_str ,
11 1 AS start_pos ,
12 Length(str) AS end_pos ,
13 (Length(str) - Length(Replace(str, ','))) + 1 AS element_count ,
14 0 AS element_no ,
15 ROWNUM AS rn
16 FROM t )
17 SELECT trim(Substr(mod_str, start_pos, end_pos-start_pos)) str
18 FROM (
19 SELECT *
20 FROM model_param MODEL PARTITION BY (rn, orig_str, mod_str)
21 DIMENSION BY (element_no)
22 MEASURES (start_pos, end_pos, element_count)
23 RULES ITERATE (2000)
24 UNTIL (ITERATION_NUMBER+1 = element_count[0])
25 ( start_pos[ITERATION_NUMBER+1] = instr(cv(mod_str), ',', 1, cv(element_no)) + 1,
26 end_pos[iteration_number+1] = instr(cv(mod_str), ',', 1, cv(element_no) + 1) ) )
27 WHERE element_no != 0
28 ORDER BY mod_str ,
29 element_no
30 /
STR
------------------------------------------
word1
word2
word3
word4
word5
word6
6 rows selected.
SQL>
คุณยังสามารถใช้แพ็คเกจ DBMS_UTILITY ที่ได้รับจาก Oracle ได้ มันมีโปรแกรมย่อยยูทิลิตี้ต่างๆ โปรแกรมอรรถประโยชน์ที่มีประโยชน์อย่างหนึ่งคือ ขั้นตอน COMMA_TO_TABLE ซึ่งจะแปลงรายชื่อที่คั่นด้วยเครื่องหมายจุลภาคให้เป็นตารางชื่อ PL/SQL
อ่าน DBMS_UTILITY.COMMA_TO_TABLE
person
Lalit Kumar B
schedule
23.02.2015