如何基于给定SQL表以特定方式将一列转换为多行?
列转多行的SQL实现方案(基于给定表结构)
嘿,我猜你是要把表中的某一列拆分成多行展示对吧?先结合你给出的表结构和测试数据,我整理了不同数据库下的实现方案,你可以按需选用~
给定的表结构与测试数据
1. STORE表
CREATE TABLE STORE ( STORE_CODE INT, STORE_NAME VARCHAR(20), STORE_YTD_SALES NUMERIC, REGION_CODE INT, EMP_CODE INT ); INSERT INTO STORE VALUES ('1', 'Access Junction', '1003455.76', '2', '8'), ('2', 'Database Corner', '1421987.39', '2', '12'), ('3', 'Tuple Charge', '986783.22', '1', '7'), ('4', 'Attribute Alley', '944568.56', '2', '3'), ('5', 'Primary Key Point', '2930098.45', '1', '15');
2. REGION表
CREATE TABLE REGION ( REGION_CODE INT, REGION_DESCRIPT VARCHAR(10) ); INSERT INTO REGION VALUES ('1', 'East...');
列转多行的具体实现
这里以拆分STORE_NAME列(按空格分隔)为多行为例,不同数据库的写法有所区别:
1. MySQL 环境
利用递归CTE生成数字辅助表,配合SUBSTRING_INDEX函数拆分:
WITH RECURSIVE nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < 10 -- 可根据实际最大拆分数量调整 ) SELECT s.STORE_CODE, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(s.STORE_NAME, ' ', nums.n), ' ', -1)) AS STORE_NAME_PART, s.STORE_YTD_SALES, s.REGION_CODE, s.EMP_CODE FROM STORE s JOIN nums ON nums.n <= LENGTH(s.STORE_NAME) - LENGTH(REPLACE(s.STORE_NAME, ' ', '')) + 1 ORDER BY s.STORE_CODE, nums.n;
2. PostgreSQL 环境
用string_to_array把字符串转成数组,再用unnest展开成多行:
SELECT s.STORE_CODE, unnest(string_to_array(s.STORE_NAME, ' ')) AS STORE_NAME_PART, s.STORE_YTD_SALES, s.REGION_CODE, s.EMP_CODE FROM STORE s ORDER BY s.STORE_CODE;
3. SQL Server 环境(2016及以上版本)
直接用内置的STRING_SPLIT函数,搭配CROSS APPLY关联原表:
SELECT s.STORE_CODE, value AS STORE_NAME_PART, s.STORE_YTD_SALES, s.REGION_CODE, s.EMP_CODE FROM STORE s CROSS APPLY STRING_SPLIT(s.STORE_NAME, ' ') ORDER BY s.STORE_CODE;
如果你的需求是拆分其他列(比如REGION_DESCRIPT的特定分隔符),只需要把上述SQL中的列名和分隔符替换成对应的内容就可以啦~
内容的提问来源于stack exchange,提问作者J.M
相关产品推荐
相关产品推荐

