提问人:NEWBIE 提问时间:8/25/2022 最后编辑:MT0NEWBIE 更新时间:8/25/2022 访问量:84
按关键字将一列变成多列
Turn one column into multiple columns by key words
问:
如何根据特定单词将一列拆分为更多列?例如,我有表 A,我想在出现单词“AND, OR, PLUS”的地方拆分 col,以便我得到表 B 作为结果。
一个
编号 | 山坳 |
---|---|
1 | 大苹果和橙子或梨 |
2 | BANNANA 吃葡萄或蓝莓 |
3 | 最好的水果是西瓜 |
4 | 水果或糖果是最好的,或者水 |
5 | 苹果、草莓和李子加糖或桃子 |
6 | 我肚子里的甜瓜 |
B
编号 | col1 | col2 | col3 | col4 |
---|---|---|---|---|
1 | 大苹果 | 橙 | 梨 | |
2 | 班纳纳吃葡萄 | 蓝莓 | ||
3 | 最好的水果是西瓜 | |||
4 | 水果 | 糖果是最好的 | 水 | |
5 | 苹果草莓 | 李子 | 糖 | 桃 |
6 | 我肚子里的甜瓜 |
答:
2赞
MT0
8/25/2022
#1
您可以拆分字符串,然后:PIVOT
SELECT *
FROM (
SELECT id,
idx,
match
FROM table_name
CROSS APPLY (
SELECT LEVEL AS idx,
REGEXP_SUBSTR(
col,
'(.+?)(\s+(AND|OR|PLUS)\s+|$)',
1,
LEVEL,
'i',
1
) AS match
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(
col,
'(.+?)(\s+(AND|OR|PLUS)\s+|$)',
1,
'i'
)
)
)
PIVOT (
MAX(match)
FOR idx IN (1 AS col1, 2 AS col2, 3 AS col3, 4 AS col4)
);
注: SQL 语句必须具有固定数量的输出列,因此不能使用静态 SQL 语句动态设置列数。最好只使用内部查询(不使用执行 PIVOT
的外部包装器)并将值输出为行而不是列,然后如果要转置为列,请在用于访问数据库的任何前端中执行此操作。
其中,对于示例数据:
CREATE TABLE table_name (ID, col) AS
SELECT 1, 'THE BIG APPLE AND ORANGE OR PEAR' FROM DUAL UNION ALL
SELECT 2, 'BANNANA EATS GRAPE OR BLUEBERRY' FROM DUAL UNION ALL
SELECT 3, 'THE BEST FRUIT IS WATERMELON' FROM DUAL UNION ALL
SELECT 4, 'FRUITS OR CANDY ARE THE BEST OR WATER' FROM DUAL UNION ALL
SELECT 5, 'APPLE STRAWBERRY AND PLUM PLUS SUGAR OR PEACH' FROM DUAL UNION ALL
SELECT 6, 'MELON IN MY BELLY' FROM DUAL;
输出:
编号 COL1 COL2 COL3系列 COL4 1 大苹果 橙 梨 零 2 班纳纳吃葡萄 蓝莓 零 零 3 最好的水果是西瓜 零 零 零 4 水果 糖果是最好的 水 零 5 苹果草莓 李子 糖 桃 6 我肚子里的甜瓜 零 零 零
db<>fiddle 在这里
评论