繁体   English   中英

来自平面文件的SQL查询

[英]SQL query from flat file

我有一张桌子,例如:

John email1 email2 email3 ...and so on

我需要将数据集转换为以下格式:

John email1
John email2
John email3

如果可以的话,可以将其导出到Excel,然后重新导入。 谢谢...

假设Name,Email1,Email2,Email3是列名:

   Select Name, Email1
    From YourTable
    Where Email1 <> ''
    Union
    Select Name, Email2
    From YourTable
    Where Email2 <> ''
    Union
    Select Name, Email3
    From YourTable
    Where Email3 <> ''

你是什​​么意思修复? 您可以这样做:

SELECT name+' '+email1 as email1,
       name+' '+email2 as email2, 
       name+' '+email3 as email3, 
       name+' '+email3 as email3, 
       ...
FROM table

上面是在我看到格式之前写的...我相信这是您想要的-仅在mssqlserver上测试过

declare @t table
(
  name varchar(max),
  email1 varchar(max),
  email2 varchar(max),
  email3 varchar(max),
  email4 varchar(max)
)

insert into @t 
 values ('name1a','email1a','email2a','email3a','email4a')
insert into @t  
 values ('name2b','email1b','email2b','email3b','email4b')

 select * from @t

SELECT name, email 
FROM
(
SELECT name, email1, email2, email3, email4
FROM @t) p
UNPIVOT
   (email FOR emails IN 
      (email1, email2, email3, email4)
)AS unpvt

我认为没有理由“走出去”到XLS或其他东西,然后重新导入。

您可以通过以下方式解决问题

1)(仅当认为有价值时,取决于数据库大小,行数等),可能会在表上删除一些索引。

2)运行INSERT查询以添加新行,即由“名称”和“ Emailn”列(以及其他所需的列或所需的默认值)组成的新行

3)一旦所有“电子邮件”列都已分派,请更改表架构以删除这些列。

4)重新构建较早删除的索引和/或重新打包其他索引。

具体来说,对于#2,查询看起来像

INSERT INTO MyTable 
   (Name, Email1, SomeOtherColumn, YetOtherColumn)
   SELECT Name, Email2, someColumn, "ABC"
   FROM MyTable
   WHERE Email2 IS NOT NULL

当然,您可以对Email1以外的每个“ Emailn”列执行此操作。 等等...

当表很大等情况时,可能只有困难,但是由于您正在考虑使用Excel,所以情况可能并非如此。

彻底检修 (我的原始答案是根据问题的短期错误版本)。

如果“平面文件”是指文本文件,则用于转换的简单(非SQL)版本将是使用awk和以下内容:

awk "{ for (i = 2; i <= NF; i++ ) { print $1, $i }}" < original.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM