【问题标题】:How to split a column with 2 data type in 2 columns (sql server)如何将具有 2 种数据类型的列拆分为 2 列(sql server)
【发布时间】:2016-11-21 11:21:16
【问题描述】:

我有一个巨大的 .CSV 文件,其中包含有关铁人三项比赛(人物、时间、国家、总时间等)的所有信息,都在 varchar 中...

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

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

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

但我想将表格中的那一列拆分为两列。一个带有日期时间值,另一个带有 varchar 列。

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

【问题讨论】:

  • 如果您要导入大量文件,我建议您使用SSIS。您可以遵循两种基本模式。将所有数据加载到staging table 中,然后编写一个查询,将值拆分为列。或者在 SSIS 管道中执行该转换。函数ISDATE(SQL Server 2008 或更高版本)可以帮助实现第一个选项。

标签: sql-server types multiple-columns


【解决方案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

【讨论】:

    【解决方案2】:

    我不是专业人士,但最好的方法是在导入数据库之前将其过滤掉。您使用 .csv 文件,那么将它们拆分为一列的数据时间和 varchar 的第二列将不会有问题。然后在您已经有两个单独的列时上传它

    【讨论】:

    • 重点是我有 300 个 .csv 每个 100 多条记录,所以我无法手动过滤它们。
    • 相信我,如果您在已经导入的情况下尝试拆分它,这将是一个更大的问题。如果它允许你上传它,它可能会是一个 varchar 类型。那么您必须拆分日期类型,我认为最好在 excel 中而不是在您使用的任何软件中进行。如果您想避免头痛拆分功能,那么最好按原样导入它们。对不起,不能帮助你更多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多