sql - 尝试使用 Snowflake sql 将一列拆分为多列
问题描述
数据需要从 SOID 列拆分为 Circ、Language、Words,如上图所示。尝试使用以下逻辑时:-
SELECT SOID,
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, 'Words:\\s([a-zA-Z0-9 ]*)(,\\s|$)', 1, 1, 'e') AS "Words"
FROM XYZ;
数据得到了正确处理,但是根据以黄色突出显示的图片,某些数据没有被上述逻辑捕获。它没有将语言显示为英语,而是将其显示为 null,并将电路显示为 Biotechnology.... 如图所示,它显示为 null。请需要您的意见。
解决方案
似乎问题与处理“(s)”部分有关:
with XYZ as (
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: 500' as SALES_ORDER_ITEM_DESCRIPTION
union all
select 'Attachments: 1, Circuit: Biotechnology Newsline [National], Language(s): English, Words: 600' as SALES_ORDER_ITEM_DESCRIPTION
)
SELECT
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"
FROM XYZ;
+-----------------------------------+-----------------+
| Circuit | Language |
+-----------------------------------+-----------------+
| North America | English |
| North America | English,Spanish |
| Biotechnology Newsline [National] | English |
+-----------------------------------+-----------------+
推荐阅读
- firebase - 我的用户查询为我提供了我输入的字母下方的所有数据
- c# - 如果我不使用 SQL,与链接 Funcs 相比,使用表达式构建动态 LINQ 查询有什么好处吗?
- c++ - range-v3 中的 view_closure 是什么?
- angular - 尝试在 Angular 中上传文件时出错(Content-Disposition)
- docusignapi - 使用 API 对 Docusign 中的签名进行排序
- image - 使用终端创建图像
- mysql - IN-Clause 中缺少 Mysql 返回结果
- cypress - CypressError:重试超时:cy.wait() 超时等待 5000 毫秒
- c++ - 为什么此代码针对以下约束显示 TLE 1≤T≤10 1≤K≤N≤10^6
- gitlab - 如何从 Gitlab 中删除未连接到项目的问题、mergeequets 和 todotask?