关于Oracle中实现单列拆分成多列的技术应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Oracle中实现单列拆分成多列的技术应用相关的知识,希望对你有一定的参考价值。
参考技术A 1.前言:通过使用FineBI进行“点地图”方式来展现数据。2.遇到的问题:原始表 经纬度 是一个字段保存,比如 xy列 中某行值为“130.111111,33.999999”。
3.解决的方法:通过 xy列 中’,‘逗号并使用函数substr()和函数instr() 处理后效果图和SQL示例如下
4.附注:
substr函数的用法 :
取得字符串中指定起始位置和长度的字符串 ,默认是从起始位置到结束的子串。
substr( string, start_position, [ length ] ) 即: substr('目标字符串',开始位置,长度)
instr函数的用法 :
格式一:instr( string1, string2 ) 即: instr(源字符串, 目标字符串),本案例是使用此格式。
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) 即:instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
instr是一个非常好用的字符串处理函数,几乎所有的字符串分隔都用到此函数。
如何在雪花sql中将单列拆分为多列[重复]
【中文标题】如何在雪花sql中将单列拆分为多列[重复]【英文标题】:How to split the single column to multiple column in snowflake sql [duplicate] 【发布时间】:2021-08-02 08:55:31 【问题描述】:用下面的表达式提取电路,处理正确。 regexp_substr(SALES_ORDER_ITEM_DESCRIPTION, 'Circuit:\s([a-zA-Z0-9 [] \& ]+)(,\s|$)', 1, 1, 'e') AS "Circuit", 但我发现由于括号而导致电路显示为空的这种情况-->附件:2,电路:国际金融电汇(自助服务),语言:英语,荷兰语,单词:357' 这种情况没有得到处理电路。
【问题讨论】:
请根据question guide 提供示例数据和所需的输出并展示您的尝试。 嗨,粘贴了所需的输出,我正在使用 Regex_substr,仍然缺少一些东西 【参考方案1】:这应该使用regexp_substr来完成这项工作
SELECT
regexp_substr(base_string, 'Circuit:\\s([a-zA-Z0-9, ]*)(,\\s|$)', 1, 1, 'e') AS "Cir",
regexp_substr(base_string, 'Language\\(s\\):\\s([a-zA-Z0-9, ]+)(,\\s|$)', 1, 1, 'e') AS "Language",
regexp_substr(base_string, 'Words:\\s([a-zA-Z0-9, ]*)(,\\s|$)', 1, 1, 'e') AS "Words"
FROM values
('Attachment(s): 2, Circuit: OTC Specialty New York Metro, Language(s): English, Words: 1944'),
('Attachment(s): 2, Circuit: North America, Language(s): English, Words: 46'),
('Attachment(s): 3, Circuit: North America, Language(s): English,Spanish, Words: 117')
AS my_table(base_string)
;
【讨论】:
非常感谢,帮了大忙。 附件:2,电路:北美,语言:英语,单词:46 此代码运行良好,但在某些情况下,如以下示例:附件:1,语言:英语,字数:400 -- 语言显示为 null 而不是英语 那是因为这里使用的正则表达式依赖于您提供的键名。例如:电路/语言/单词您的关键名称是否会从一个记录更改为另一个记录?例如:语言 -> 语言 如何实现这种情况,请提供您的意见。我有该列的两种方式的数据。语言:/ 语言: 如果你想匹配语言或语言,你可以使用这个正则表达式:regexp_substr(base_string, 'Language(\(s\)|):\\s([a-zA- Z0-9, ]+)(,\\s|$)', 1, 1, 'e', 2) 作为“语言”。但在我看来,你的输入键应该是一致的(不应该在记录之间改变)。以上是关于关于Oracle中实现单列拆分成多列的技术应用的主要内容,如果未能解决你的问题,请参考以下文章