【问题标题】:How can I modify this SQL SELECT statement to change non-numeric values?如何修改此 SQL SELECT 语句以更改非数字值?
【发布时间】:2017-07-06 23:05:40
【问题描述】:

我使用的数据集可以在here找到。

我正在使用 SSIS 将数据集上传到 MS SQL Server。

我将所有内容都作为文本上传,并尝试通过插入原始表中的值来创建具有适当数据类型的工作表。

CREATE TABLE [WRK_demographics]
(
        [RowNumber]         INT IDENTITY(1,1)
        ,[DBN]              VARCHAR(10)
        ,[Name]             VARCHAR(1000)
        ,[schoolyear]       VARCHAR(100)
        ,[fl_percent]       FLOAT
        ,[frl_percent]      FLOAT
        ,[total_enrollment] INT
        ,[grade9]           INT
        ,[grade10]          INT
        ,[grade11]          INT
        ,[grade12]          INT
        ,[ell_num]          INT
        ,[ell_percent]      FLOAT
        ,[sped_num]         INT
        ,[sped_percent]     FLOAT
        ,[ctt_num]          INT
        ,[selfcontained_num] INT
        ,[asian_num]        INT
        ,[asian_per]        FLOAT
        ,[black_num]        INT
        ,[black_per]        FLOAT
        ,[hispanic_num]     INT
        ,[hispanic_per]     FLOAT
        ,[white_num]        INT
        ,[white_per]        FLOAT
        ,[male_num]         INT
        ,[male_per]         FLOAT
        ,[female_num]       INT
        ,[female_per]       FLOAT
)

INSERT INTO [WRK_demographics]
(       
        [DBN]
        ,[Name]
        ,[schoolyear]
        ,[fl_percent]
        ,[frl_percent]
        ,[total_enrollment]
        ,[grade9]
        ,[grade10]
        ,[grade11]
        ,[grade12]
        ,[ell_num]
        ,[ell_percent]
        ,[sped_num]
        ,[sped_percent]
        ,[ctt_num]
        ,[selfcontained_num]
        ,[asian_num]
        ,[asian_per]
        ,[black_num]
        ,[black_per]
        ,[hispanic_num]
        ,[hispanic_per]
        ,[white_num]
        ,[white_per]
        ,[male_num]
        ,[male_per]
        ,[female_num]
        ,[female_per]               
)
SELECT 
        [DBN]
        ,[Name]
        ,[schoolyear]
        ,[fl_percent]
        ,[frl_percent]
        ,[total_enrollment]
        ,[grade9]
        ,[grade10]
        ,[grade11]
        ,[grade12]
        ,[ell_num]
        ,[ell_percent]
        ,[sped_num]
        ,[sped_percent]
        ,[ctt_num]
        ,[selfcontained_num]
        ,[asian_num]
        ,[asian_per]
        ,[black_num]
        ,[black_per]
        ,[hispanic_num]
        ,[hispanic_per]
        ,[white_num]
        ,[white_per]
        ,[male_num]
        ,[male_per]
        ,[female_num]
        ,[female_per]
FROM [RAW_demographics_20170706]

但是,我遇到的问题是,对于没有值的单元格,有文本而不是空单元格。因此,隐式转换无法将数据转换为int/float。有没有办法可以修改SELECT 语句以将非数字单元格的值更新为NULL?如果我没有那么多列,我会在插入工作表之前像这样更新原始表中的每一列:

UPDATE [RAW_demographics_20170706]
SET [fl_percent] = NULL
WHERE ISNUMERIC([fl_percent]) <> 1

我想知道是否有更有效的途径。

【问题讨论】:

    标签: sql sql-server ssis


    【解决方案1】:

    您需要使用 case 语句,因为您的错误应该来自空字符串而不是实际的 NULL

    SELECT 
            [DBN]
            ,[Name]
            ,[schoolyear]
            ,case when [fl_percent] = '' then 0.0 else fl_percent end
            ,case when [frl_percent] = '' then 0.0 else flr_percent end
            ...
            ...
            ,case when [grade12] = '' then 0 else grade12 end
            ...
    FROM [RAW_demographics_20170706]
    

    我也不会在这种情况下使用ISNUMERIC。它将导致问题,因为它对于 int 或 float 以外的情况数组返回 true。

    这些返回 true,但转换失败:

    select isnumeric('$') 
    select isnumeric('1e4')
    etc...
    

    【讨论】:

      【解决方案2】:

      这就是TRY_CAST 的用途:“如果转换成功,则返回一个转换为指定数据类型的值;否则,返回null。”

      【讨论】:

      • 那么我需要为每列添加一个 TRY_CAST 语句吗?
      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多