Oracle将一列分成多列 和 行转列

本文介绍如何在SQL中将一列数据拆分为多列,包括使用REGEXP_SUBSTR、SUBSTR和INSTR函数的方法。同时,也展示了如何将行数据转换为列数据,适用于成绩等数据的汇总展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一列分成多列方法:

1.SELECT REGEXP_SUBSTR(name,'^[^ ]*') first_name, REGEXP_SUBSTR(name, '([[:alpha:]]+)$') middle_name FROM CELEBRITY

2.SELECT SUBSTR(NAME, 1, INSTR(NAME, ' ')-1) FIRST_NAME, SUBSTR(NAME, INSTR(NAME, ' ')+1) MIDDLE_NAME FROM CELEBRITY

3.SELECT
  SUBSTR(NAME, 1, SPACE_POS-1) FIRST_NAME,
  SUBSTR(NAME, SPACE_POS+1) MIDDLE_NAME
FROM (SELECT NAME,INSTR(NAME, ' ') SPACE_POS
FROM CELEBRITY)

行转列

select t.user_name as 姓名,
    MAX(decode(t.course,'语文',score,null)) as 语文,
    MAX(decode(t.course,'数学',score,null)) as 数学,
    MAX(decode(t.course,'英语',score,null)) as 英语
from RowToCol t group by t.user_name  order by t.user_name
 

*当要分组的值,如例子中的score列是数值型,则聚集函数可以使用sum/max/min/avg,但是字符行的只能使用max/min。

取小数点值  select regexp_substr('12.12元/小时', '\d*(\d*\.\d*)?') from dual

### 使用 SQL 实现单列拆分为两列 对于将单一列中的字符串值拆分为多个列的需求,在不同的数据库管理系统中有多种实现方式。下面介绍几种常见的方式。 #### Oracle 数据库中使用 `SUBSTR` `INSTR` 在Oracle环境中,可以利用`SUBSTR``INSTR`函数组合来完成此操作。这两个函数能够帮助定位并提取特定位置上的子串[^1]: ```sql SELECT SUBSTR(column_name, 1, INSTR(column_name, delimiter) - 1) AS part1, SUBSTR(column_name, INSTR(column_name, delimiter) + LENGTH(delimiter)) AS part2 FROM table_name; ``` 这里假设`delimiter`代表用于分隔各部分的字符;如果不存在该字符,则上述查询可能会返回不期望的结果。 #### MySQL 中使用 `SUBSTRING_INDEX` MySQL 提供了一个更为简便的方法——`SUBSTRING_INDEX()` 函数,它可以直接按照给定的分隔符截取所需的部分[^3]: ```sql SELECT SUBSTRING_INDEX(column_name, delimiter, 1) as part1, SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, delimiter, 2), delimiter, -1) as part2 FROM table_name; ``` 这段代码会依次取出由`delimiter`划分出来的第一段作为`part1`,第二段作为`part2`。 #### SQL Server 中自定义解决方案 由于SQL Server 的内置功能有限制(例如 PARSENAME 只能处理'.'并且最多四个片段),因此可能需要编写更复杂的表达式或存储过程来满足具体需求[^2]。一种简单的做法是采用交叉应用 (CROSS APPLY),配合 CHARINDEX 来查找分隔符的位置,并据此切割原始字符串: ```sql SELECT LEFT(col, CHARINDEX(' ', col)-1) AS first_part, RIGHT(col, LEN(col) - CHARINDEX(' ', col)) AS second_part FROM your_table t CROSS APPLY ( VALUES(t.your_column) ) v(col); ``` 以上例子假定是以空格为空白分隔符的情况下的简单实例化展示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值