按关键字将一列变成多列

Turn one column into multiple columns by key words

提问人:NEWBIE 提问时间:8/25/2022 最后编辑:MT0NEWBIE 更新时间:8/25/2022 访问量:84

问:

如何根据特定单词将一列拆分为更多列?例如,我有表 A,我想在出现单词“AND, OR, PLUS”的地方拆分 col,以便我得到表 B 作为结果。

一个

编号 山坳
1 大苹果和橙子或梨
2 BANNANA 吃葡萄或蓝莓
3 最好的水果是西瓜
4 水果或糖果是最好的,或者水
5 苹果、草莓和李子加糖或桃子
6 我肚子里的甜瓜

B

编号 col1 col2 col3 col4
1 大苹果
2 班纳纳吃葡萄 蓝莓
3 最好的水果是西瓜
4 水果 糖果是最好的
5 苹果草莓 李子
6 我肚子里的甜瓜
SQL 预言机

评论

1赞 Isolated 8/25/2022
你打算什么时候接受问题的答案?这周你问了几个问题,得到了很好的答案,但你还没有接受任何问题。
1赞 NEWBIE 8/25/2022
很抱歉,我仍在学习这个平台是如何工作的。谢谢你让我知道。
0赞 Isolated 8/25/2022
没问题,很高兴它对你有用。

答:

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 在这里