【问题标题】:oracle split comma delimited string into columnsoracle 将逗号分隔的字符串拆分为列
【发布时间】:2015-10-13 23:21:20
【问题描述】:

我有一张这样的桌子

Charge_num      mapping_col
---------       -----------
p1.pm.100       1.1.1,1000
p1.pm.110       1.2.1,1000
p1.pm.120       1.3.1,1000

我需要像这样将“mapping_col”分成两列:

Charge_num      wbs       obs
---------       ---       ---
p1.pm.100       1.1.1     1000
p1.pm.110       1.2.1     1000
p1.pm.120       1.3.1     1000

【问题讨论】:

  • 首先,为什么将数据存储为分隔字符串?您违反了规范化。无论如何,作为一种解决方法,只需使用SUBSTRINSTR。 INSTR 将返回逗号, 的位置,然后根据该位置分隔子字符串。请记住,即使使用 12c,SUBSTR + INSTR 方法仍然比 REGEX 更快。
  • 我没有那样存储它,但我必须写一个从那个系统中提取数据的报告。当我第一次发现这种情况时,我的第一反应是它违反了第一范式。
  • "它违反了第一范式" 当然它违反了基本规则。无论如何,我想,您现在可以应用解决方法。并且,提出设计修复作为您组织的永久解决方案。您甚至可以创建虚拟列。祝你好运!

标签: sql oracle oracle11g


【解决方案1】:

REGEXP_SUBSTR 来救援!

with sample_data as (select 'p1.pm.100' charge_num, '1.1.1,1000' mapping_col from dual union all
                     select 'p1.pm.110' charge_num, '1.2.1,1000' mapping_col from dual union all
                     select 'p1.pm.120' charge_num, '1.3.1,1000' mapping_col from dual)
select charge_num,
       regexp_substr(mapping_col, '[^,]+', 1, 1) wbs,
       regexp_substr(mapping_col, '[^,]+', 1, 2) obs
from   sample_data;

CHARGE_NUM WBS                            OBS                           
---------- ------------------------------ ------------------------------
p1.pm.100  1.1.1                          1000                          
p1.pm.110  1.2.1                          1000                          
p1.pm.120  1.3.1                          1000          

【讨论】:

  • 正则表达式的性能显然随着每个更新版本而变得更好。 +1
【解决方案2】:
select charge_num, 
substr(mapping_col,1,instr(mapping_col,',',1)-1) AS first_half,
substr(mapping_col, instr(mapping_col,',',1)+1) as last_half
from your_table

请注意,将数字存储为字符串的做法很容易出错。如果您将这些结果转换为 NUMBER(9),如果您的数据不规则,它可能会意外中断

【讨论】:

  • "请注意,将数字存储为字符串的做法很容易出错。如果您将这些结果转换为 NUMBER(9),如果您的数据不规则,它可能会意外中断“嗯,我在一定程度上同意你的看法。但是,也有例外。请注意,许多国家/地区的数据遵循某些规范,因此您必须将数据存储为分隔字符串。
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多