Extract data from table which is txt format (contain 1 fields only)

问题描述 投票:0回答:1

在我们现有的系统中,我们有一个表来存储报告的用户信息(比如UserInfo Raw),这个表只包含1个字段(详细信息),样本数据如下所示:

^StartNewUser 
^UserName
Simon
^EnableFacebook
Y
^EnableTwitter
N
^EndNewUser
^StartNewUser
^UserName
Vicky
^EnableFacebook
N
^EndNewUser

目前我们需要将此格式转换为可查询的表,让我们说“User-info”包含3个以下的字段,输出应该是

    UserName          facebook          twitter
==================================================
    Simon                 Y                N
    Vicky                 N                N   

约束是

1.我知道我需要提取的tage字段(说,^EnableFacebook是我知道的标签名称,可用于选择) 2.我们按用​​户级别提取,对于每个用户,他们必须在txt中有^StartNewUser/^EndNewUser,这是预先假设的。 3.对于某些情况(例如,Vicky's ^EnableTwitter标签),属性标签可能不存在,它应该在提取时将此字段视为N. 4.我们只能在这里使用纯SQL,因为这是我们MI团队的临时解决方案,他们只能运行SQL,目前我们无法执行任何程序发布以自动执行此过程。

目前我们已经提出了RRN的解决方案,但需要许多临时表

1:产生OUT1,其包括每个用户的开始/结束的行号

SELECT RRN(A) ,detail from UserInfoRaw A where A.detail in ('^StartNewUser' , '^EndNewUser')

OUT1 :

1           ^StartNewUser       
8           ^EndNewUser   
9           ^StartNewUser       
14          ^EndNewUser    

2:生成OUT2,其中包括用户名的行号

Select RRN(A) ,detail from UserInfoRaw A where RRN(A) IN (select RRN(B)+1 from UserInfoRaw B where B.detail = '^UserName')

OUT2 :

3           Simon
11          Vicky  

3:生成JOIN12,其中包括^ StartNewUser / ^ UserName的行映射

Select MAX(A.row) as startRow , B.row as nameRow from OUT1 A,OUT2 B where A.detail = '^StartNewUser' AND A.row <B.row GROUP BY B.row order by A.row

JOIN12 :

1           3
9           11

4:通过^ startNewUser的行加入3表以获得1字段映射

Select C.startRow ,A.detail , C.nameRow,B.detail from OUT1 A, OUT2 B, JOIN12 C where A.row=C.startRow and B.row=C.nameRow

Result :

1       ^startNewUser     3     Simon
9       ^startNewUser     11    Vicky

通过这种方法,我们可以生成1个字段映射,并且使用类似的步骤,我们可以得到我们想要的所有结果字段表。

但我们有10多个字段需要提取(如果业务请求,我们可以提供更多字段),因此我们在这里寻求帮助,看看我们是否对此案例有更好的了解。谢谢!

(ps:如果你是AS400的家伙而且你知道如何通过wrkqry产生最好的结果:)你知道MI团队我指的是什么......真的很糟糕..)

sql db2
1个回答
-1
投票

你自己承认,你有一个文本文件,而不是一个表。

SQL不是为处理文件(文本或其他)而设计的,它旨在处理包含表和关系的数据库。

因此,不要为此使用SQL语句,将其作为文本文件处理。它会更快更简单。我的默认假设是,执行READ的传统RPGLE程序将击败在SQL中进行此类处理的任何尝试,仅仅因为这是它为其设计的工作负载类型。或者使用任何其他可以处理文件的语言。

(在SQL中使用存储过程并启动游标会更容易,但它最好是不实用的,因为SQL缺少许多功能,因此使用'普通'编程语言这样做更容易,比如本地,私人活动)

tl;dr

我有一把锤子,使用它将板子切成两半的最佳方法是什么?

© www.soinside.com 2019 - 2024. All rights reserved.