Oracle一列轉(zhuǎn)多行
在某些情況下,我們需要將存儲(chǔ)在表中的數(shù)據(jù)進(jìn)行分行處理,以便更好地查看和關(guān)聯(lián)使用。特別是當(dāng)數(shù)據(jù)是通過特殊符號(hào)分隔保存的時(shí)候,這一需求就顯得更加重要。新建測(cè)試表,錄入測(cè)試數(shù)據(jù)首先,我們需要新建一個(gè)測(cè)試表,
在某些情況下,我們需要將存儲(chǔ)在表中的數(shù)據(jù)進(jìn)行分行處理,以便更好地查看和關(guān)聯(lián)使用。特別是當(dāng)數(shù)據(jù)是通過特殊符號(hào)分隔保存的時(shí)候,這一需求就顯得更加重要。
新建測(cè)試表,錄入測(cè)試數(shù)據(jù)
首先,我們需要新建一個(gè)測(cè)試表,并錄入一些測(cè)試數(shù)據(jù)。下面是創(chuàng)建表和插入數(shù)據(jù)的SQL代碼:
```
CREATE TABLE TEST_ONE (
ID VARCHAR2(5),
NAME VARCHAR2(100)
);
INSERT INTO TEST_ONE (ID, NAME) VALUES ('1', 'A:語文;B:數(shù)學(xué);C:物理;D:化學(xué);E:生物;');
INSERT INTO TEST_ONE (ID, NAME) VALUES ('2', 'x:歷史;y:地理;z:政治;');
```
這里我們創(chuàng)建了一個(gè)名為TEST_ONE的表,并在表中插入了兩條數(shù)據(jù)。
進(jìn)行數(shù)據(jù)分行處理
接下來,我們需要對(duì)數(shù)據(jù)進(jìn)行分行處理,將原始數(shù)據(jù)還原為可讀的形式。下面是SQL代碼示例:
```sql
SELECT
ID,
KEY,
RN,
SUBSTR(STR, INSTR(STR, ';;', 1, RN) 2, INSTR(STR, ':', 1, RN) - INSTR(STR, ';;', 1, RN) - 2) AS "First_Str",
SUBSTR(STR, INSTR(STR, ':', 1, RN) 1, INSTR(STR, ';;', 1, RN 1) - INSTR(STR, ':', 1, RN) - 1) AS "Second_Str"
FROM
(SELECT
ID,
NAME KEY,
';;'||NAME STR
FROM
TEST_ONE) A,
(SELECT
ROWNUM RN
FROM
DUAL
CONNECT BY
ROWNUM < 10) B
WHERE
INSTR(STR, ';;', 1, RN 1) > 0
ORDER BY
, B.RN;
```
該查詢語句的作用是將包含特殊符號(hào)的字符串進(jìn)行分割,并將分割后的部分作為新的列返回。其中,`;;`是特殊符號(hào),用于分割不同部分;`:`則用于分割每個(gè)部分的鍵值對(duì)。
語句解釋1:原始數(shù)據(jù)處理
首先,我們?cè)谠紨?shù)據(jù)前面添加了特殊符號(hào),以便下一步進(jìn)行數(shù)據(jù)分割。這里使用了字符串連接符`||`,將特殊符號(hào)和原始數(shù)據(jù)進(jìn)行連接。
```sql
SELECT
ID,
NAME KEY,
';;'||NAME STR
FROM
TEST_ONE
```
語句解釋2:生成行號(hào)
為了確保分割后的結(jié)果正確,我們需要生成一個(gè)行號(hào)序列。這里使用了層次查詢子句`CONNECT BY`,并根據(jù)實(shí)際查詢結(jié)果行數(shù)來修改`ROWNUM`的值。
```sql
SELECT
ROWNUM RN
FROM
DUAL
CONNECT BY
ROWNUM < 10
```
語句解釋3:字符串分割
在這一步中,我們通過查詢特殊符號(hào)在字符串中的位置,然后計(jì)算出前后串之間字符的長(zhǎng)度,并進(jìn)行截取。具體代碼如下:
```sql
SUBSTR(STR, INSTR(STR, ';;', 1, RN) 2, INSTR(STR, ':', 1, RN) - INSTR(STR, ';;', 1, RN) - 2) AS "First_Str",
SUBSTR(STR, INSTR(STR, ':', 1, RN) 1, INSTR(STR, ';;', 1, RN 1) - INSTR(STR, ':', 1, RN) - 1) AS "Second_Str"
```
其中,`SUBSTR`函數(shù)用于截取字符串的一部分。第一個(gè)參數(shù)是要截取的字符串,第二個(gè)參數(shù)是開始位置,第三個(gè)參數(shù)是截取的長(zhǎng)度。
語句解釋4:顯示截取結(jié)果
最后,我們通過判斷特殊符號(hào)的最后位置,來決定是否顯示截取后的結(jié)果。這是為了避免在層次查詢中產(chǎn)生過多的空值。
```sql
WHERE
INSTR(STR, ';;', 1, RN 1) > 0
```
以上就是將一列數(shù)據(jù)轉(zhuǎn)換成多行的處理方法,通過對(duì)特殊符號(hào)的分割和截取,我們可以將原始數(shù)據(jù)還原為可讀的形式,方便我們進(jìn)行查看和關(guān)聯(lián)使用。