2016 - 2024

感恩一路有你

Oracle一列转多行

浏览量:4675 时间:2024-06-28 18:31:47 作者:采采

在某些情况下,我们需要将存储在表中的数据进行分行处理,以便更好地查看和关联使用。特别是当数据是通过特殊符号分隔保存的时候,这一需求就显得更加重要。

新建测试表,录入测试数据

首先,我们需要新建一个测试表,并录入一些测试数据。下面是创建表和插入数据的SQL代码:

```

CREATE TABLE TEST_ONE (

ID VARCHAR2(5),

NAME VARCHAR2(100)

);

INSERT INTO TEST_ONE (ID, NAME) VALUES ('1', 'A:语文;B:数学;C:物理;D:化学;E:生物;');

INSERT INTO TEST_ONE (ID, NAME) VALUES ('2', 'x:历史;y:地理;z:政治;');

```

这里我们创建了一个名为TEST_ONE的表,并在表中插入了两条数据。

进行数据分行处理

接下来,我们需要对数据进行分行处理,将原始数据还原为可读的形式。下面是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;

```

该查询语句的作用是将包含特殊符号的字符串进行分割,并将分割后的部分作为新的列返回。其中,`;;`是特殊符号,用于分割不同部分;`:`则用于分割每个部分的键值对。

语句解释1:原始数据处理

首先,我们在原始数据前面添加了特殊符号,以便下一步进行数据分割。这里使用了字符串连接符`||`,将特殊符号和原始数据进行连接。

```sql

SELECT

ID,

NAME KEY,

';;'||NAME STR

FROM

TEST_ONE

```

语句解释2:生成行号

为了确保分割后的结果正确,我们需要生成一个行号序列。这里使用了层次查询子句`CONNECT BY`,并根据实际查询结果行数来修改`ROWNUM`的值。

```sql

SELECT

ROWNUM RN

FROM

DUAL

CONNECT BY

ROWNUM < 10

```

语句解释3:字符串分割

在这一步中,我们通过查询特殊符号在字符串中的位置,然后计算出前后串之间字符的长度,并进行截取。具体代码如下:

```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`函数用于截取字符串的一部分。第一个参数是要截取的字符串,第二个参数是开始位置,第三个参数是截取的长度。

语句解释4:显示截取结果

最后,我们通过判断特殊符号的最后位置,来决定是否显示截取后的结果。这是为了避免在层次查询中产生过多的空值。

```sql

WHERE

INSTR(STR, ';;', 1, RN 1) > 0

```

以上就是将一列数据转换成多行的处理方法,通过对特殊符号的分割和截取,我们可以将原始数据还原为可读的形式,方便我们进行查看和关联使用。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。