根据三个不同的类别将列拆分为多列-新场景[重复]

Posted

技术标签:

【中文标题】根据三个不同的类别将列拆分为多列-新场景[重复]【英文标题】:Split the column to multiple column based on the three diff categories--new scenario [duplicate] 【发布时间】:2021-08-03 09:49:27 【问题描述】:

数据需要从 SOID 列拆分为 Circ、Language、Words,如上图所示。尝试使用以下逻辑时:-

SELECT SALES_ORDER_ITEM_DESCRIPTION,
 --regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Circuit:\\s([a-zA-Z0-9 ]*)(,\\s|$)', 1, 1, 'e') AS "Circuit",
 --regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Language\\(s\\):\\s([a-zA-Z0-9, ]+)(,\\s|$)', 1, 1, 'e') AS "Language",
 regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Circuit:\\s([a-zA-Z0-9 \\[\\] \\& ]+)(,\\s|$)', 1, 1, 'e') AS "Circ", 
regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Language[()s]*:\\s([a-zA-Z0-9\\, ]+)(,\\s|$)', 1, 1, 'e') AS "Language",
 regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Words:\\s([a-zA-Z0-9 ]*)(,\\s|$)', 1, 1, 'e') AS "Words"
FROM XYZ;

数据得到了正确处理,但是根据红色突出显示的图片,一些数据没有被上述逻辑捕获。它没有显示所有语言,而是只选择一种语言作为英语,因为我需要将输出作为列中的所有语言。请需要您的意见。

【问题讨论】:

Words 是否总是在Language 之后?您在LanguageWords 之间总是 获取的数据? 是的,语言总是在单词之前 西蒙,我不这么认为。上一个问题是一个更简单的版本,并且已经正确回答。如我所见,这是不同的原因,Naveen 注意到语言的不同格式。 抱歉重复,Atil 回答正确,因为我发现了新场景,我只是提出了另一个问题,而不是让现有问题变得复杂。 好的,不用担心。我想,既然标题和内容真的很相似,那就是同一个场景。 【参考方案1】:

看来事情变得复杂了。要处理这种新格式,您需要对如何提取语言进行一些更改。

我没有使用一个简单的 regexp_substr,而是使用了两个。一种是处理“Language(s): xxxx”,另一种是处理“Language: x,y,z”(包括单一语言),并使用NVL将它们组合起来。

with XYZ as (
  select 'Attachments: 1, Circuit: North America, Language: English, Language: Dutch, Words: 400' as SALES_ORDER_ITEM_DESCRIPTION
  union all
  select 'Attachments: 1, Circuit: North America, Language: English, Words: 400' as SALES_ORDER_ITEM_DESCRIPTION
  union all
  select 'Attachments: 1, Circuit: North America, Language(s): English,Spanish, Words: 400' as SALES_ORDER_ITEM_DESCRIPTION                                                   
  union all
  select 'Attachments: 1, Circuit: North America, Language: English, Language: Dutch, Language: German, Words: 400' as SALES_ORDER_ITEM_DESCRIPTION
)                                                  
SELECT 
regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Circuit:\\s([a-zA-Z0-9 \\[\\]]+)(,\\s|$)', 1, 1, 'e') AS "Circuit", 
NVL( regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Language\\(s\\):\\s([a-zA-Z0-9\\, ]+)(,\\s|$)', 1, 1, 'e'), 
REGEXP_REPLACE( regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, '(Language:.*), Words', 1, 1, 'e'), '[ ]*Language: '  )) AS "LanguageString"
FROM XYZ;


+---------------+----------------------+
|    Circuit    |    LanguageString    |
+---------------+----------------------+
| North America | English,Dutch        |
| North America | English              |
| North America | English,Spanish      |
| North America | English,Dutch,German |
+---------------+----------------------+

【讨论】:

嗨,Atil,它工作正常。我发现了电路的另一个原因,它正在处理正确的以下表达式。 regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Circuit:\\s([a-zA-Z0-9 \[\] \\& ]+)(,\\s|$)', 1, 1, 'e') AS "Circuit ",附件:2,电路:国际金融电汇(自助服务),语言:英语,荷兰语,单词:357' 这个场景没有在电路中得到处理。

以上是关于根据三个不同的类别将列拆分为多列-新场景[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将列拆分为具有某些功能的多列?

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

将 Pandas 单元格中的列表拆分为多列 [重复]

将多个字符串拆分为多列

熊猫:将列中的列表拆分为多行[重复]

将我的 Access 表导出到 Excel,但将列中的不同值拆分到不同的工作表中