2016-11-21 62 views
0

我有一个巨大的.CSV文件,关于铁人三项赛(人,时间,国家,总体时间...等)的信息都在varchar ...如何拆分2列中的2个数据类型的列(sql服务器)

问题是一列(Overalltime)存储datatime和varchar类型。 varchars是(DNS,DNF,DQ),例如数据时间是(09:09:30)。

当我创建表,我有这样的一列:

 overalltime 
     ------------- 
     09:09:30 
     09:10:22 
      DNF 
      DNS 

但我想在表中拆分列,有两列。一个带有日期时间值,另一个带有varchar列。

将分隔该列的最佳方法是什么?

+0

如果要导入大量的我建议使用[SSIS]文件(https://msdn.microsoft.com/en-us/library/ms141026.aspx)。您可以遵循两种基本模式。将所有数据加载到[登台表](https://en.wikipedia.org/wiki/Staging_(data)),然后编写一个将值拆分为列的查询。或者在SSIS管道中执行该转换。函数[ISDATE](https://msdn.microsoft.com/en-us/library/ms187347.aspx)(SQL Server 2008或更高版本)可以帮助使用第一个选项。 –

回答

1

一种方法是使用case expression有条件地打破自己的价值观为列:

-- Ussing CASE to split rows into columns. 
WITH SampleData AS 
    (
     -- Provides sample data to play with. 
     SELECT 
      r.overalltime 
     FROM 
      (
       VALUES 
        ('09:09:30'), 
        ('09:09:30'), 
        ('DNF'), 
        ('DNS') 
      ) AS r(overalltime) 
    ) 
SELECT 
    CASE WHEN ISDATE(overalltime) = 1 THEN overalltime ELSE NULL END AS [Time], 
    CASE WHEN overalltime = 'DNS'  THEN 1    ELSE 0  END AS DNS, 
    CASE WHEN overalltime = 'DNF'  THEN 1    ELSE 0  END AS DNF 
FROM 
    SampleData 
; 

返回:

Time  DNS DNF 
09:09:30 0 0 
09:09:30 0 0 
NULL  0 1 
NULL  1 0 
0

即时通讯不亲,但最好的办法是在导入到数据库之前将其过滤掉。你使用.csv文件,那么它将不会是一个问题,将它们分成一列的datatime和varchar的第二列。然后上传它,当你已经有两个单独的列

+0

重点是我有300个.csv每个超过100个记录,所以我不能手动过滤它们。 – 0xJorge

+0

相信我,如果您在导入它时尝试分割它,将会是一个更大的问题。如果它允许你上传它,它可能会是一个varchar类型。那么你必须拆分日期类型,我认为最好在Excel中而不是在你使用的任何软件中进行。如果你想避免头痛分裂功能,那么最好将它们按照它们的方式导入。对不起,不能帮助你 –