如何处理列中嵌入的列表和范围?

时间:2011-02-10 19:16:32

标签: sql denormalized

我无法控制我正在尝试处理的数据格式。当然,我可以使用脚本语言来处理数据库之外的以下问题,但我想避免因为我正在处理的数据量而且因为我想消除手册的必要性步骤。

简而言之,我有一张清单。列表可以包括单个3位数字符串,多个3位数字符串,一系列3位数字符串,例如012-018,或许多3位数字符串和3位数字符串范围。例如:

drop table list;
drop table lists;

create table lists (id varchar, vals varchar);

insert into lists values('A', '001,003-005');
insert into lists values('B', '008-007');
insert into lists values('C', '010, 011, 012');
insert into lists values('D', '011-013, 016-018, 020');

我知道 我知道

我想把它变成下表:

create table list (id varchar, val varchar);
A   001
A   003
A   004
A   005
B   008
B   007
C   010
C   011
C   012
D   011
D   012
D   013
D   016
D   017
D   018
D   020

有没有办法在SQL中执行此操作?

1 个答案:

答案 0 :(得分:3)

由于您没有使用特定的RDBMS标记您的问题,我将不得不回答。

SQL本身不提供您正在寻找的基本操作,这基本上是字符串拆分。这意味着您必须自己编写,或使用已在线发布的许多之一。

但是,您的数据范围很复杂。这意味着您的程序将如下所示:

  1. 将数据插入临时/内存表并以程序方式迭代(或者使用游标执行相同操作)
  2. 对于集合中的每条记录,提取非规范化的字符串数据并将其拆分为','
  3. 对于拆分数据中的每个元素,您必须按<{1}}分割 (对于非范围元素,应该返回单个结果)。< / LI>
  4. 如果您的第二次分割(在'-'上)产生一个结果,则它是您可以插入最终目的地的单个记录。如果它产生两个结果,那么它是一个范围,你必须从开始到结束迭代(使用该分割的元素1和2)并将记录插入到你的最终目的地
  5. 评论后编辑

    不幸的是,我对PROC SQL或SAS没有任何熟悉,所以我无法为此提供具体的解决方案。我可以在SQL Server T-SQL中发布以下内容,希望能帮助您入门。

    '-'