根据三个不同的类别将列拆分为多列-新场景[重复]
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
之后?您在Language
和Words
之间总是 获取的数据?
是的,语言总是在单词之前
西蒙,我不这么认为。上一个问题是一个更简单的版本,并且已经正确回答。如我所见,这是不同的原因,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' 这个场景没有在电路中得到处理。以上是关于根据三个不同的类别将列拆分为多列-新场景[重复]的主要内容,如果未能解决你的问题,请参考以下文章