如何拆分字符串然后在sql过程中转换为int

时间:2017-03-27 10:38:31

标签: sql sql-server stored-procedures

我有一个包含数据的表,我希望将其转换为整数。

示例:

如果列具有值:示例值

 ISNULL([Jan],0)+ISNULL([Feb],1) +ISNULL([Mar],3) +ISNULL([Apr],0) 
 +ISNULL([May],0) +ISNULL([Jun],0) +ISNULL([Jul],0) +ISNULL([Aug],1) 
 +ISNULL([Sep],0) +ISNULL([Oct],3) +ISNULL([Nov],0) +ISNULL([Dec],2) 

我需要输出为10

提前致谢。

3 个答案:

答案 0 :(得分:2)

添加了一个额外的列和行,以演示如何使用具有不同信息的多个行。

这应该这样做:

DECLARE @t table(id int identity(1,1), a varchar(max))
INSERT @t values
('ISNULL([Jan],0)+ISNULL([Feb],1) +ISNULL([Mar],3) +ISNULL([Apr],0) 
 +ISNULL([May],0) +ISNULL([Jun],0) +ISNULL([Jul],0) +ISNULL([Aug],1) 
 +ISNULL([Sep],0) +ISNULL([Oct],3) +ISNULL([Nov],0) +ISNULL([Dec],2) '),

(' ISNULL([Jan],5)+ISNULL([Feb],1) +ISNULL([Mar],3) +ISNULL([Apr],0) 
 +ISNULL([May],0) +ISNULL([Jun],0) +ISNULL([Jul],0) +ISNULL([Aug],1) 
 +ISNULL([Sep],0) +ISNULL([Oct],3) +ISNULL([Nov],0) +ISNULL([Dec],2) ')

 SELECT id, sum(cast(t.c.value('.', 'VARCHAR(2000)') as int)) x
 FROM (
     SELECT id, x = CAST('<t>' + 
        REPLACE(REPLACE(a, ',', '</t><t>'), ')', '</t><t>') + '</t>' AS XML)
     FROM @t
 ) a
 CROSS APPLY x.nodes('/t') t(c)
 WHERE isnumeric(t.c.value('.', 'VARCHAR(2000)')) = 1
 GROUP BY id

结果:

id  x
1   10
2   15

答案 1 :(得分:0)

ISNULL无法正常工作,因为如果该字段不为NULL,它将追加该字段。正如其他人所说,您应该优先改变数据库的结构。

尽管如此......如果表格中有一行,这应该有效。

Select [Jan] + [Feb] + [Mar] + [Apr] + [May] + [Jun] + [Jul] + [Aug] + [Sep] + [Oct] + [Nov] + [Dec]
From
(
Select
    CASE WHEN [Jan] IS NULL THEN 0 ELSE 0 END 'Jan',
    CASE WHEN [Feb] IS NULL THEN 1 ELSE 0 END 'Feb',
    CASE WHEN [Mar] IS NULL THEN 3 ELSE 0 END 'Mar',
    CASE WHEN [Apr] IS NULL THEN 0 ELSE 0 END 'Apr',
    CASE WHEN [May] IS NULL THEN 0 ELSE 0 END 'May',
    CASE WHEN [Jun] IS NULL THEN 0 ELSE 0 END 'Jun',
    CASE WHEN [Jul] IS NULL THEN 0 ELSE 0 END 'Jul',
    CASE WHEN [Aug] IS NULL THEN 1 ELSE 0 END 'Aug',
    CASE WHEN [Sep] IS NULL THEN 0 ELSE 0 END 'Sep',
    CASE WHEN [Oct] IS NULL THEN 3 ELSE 0 END 'Oct',
    CASE WHEN [Nov] IS NULL THEN 0 ELSE 0 END 'Nov',
    CASE WHEN [Dec] IS NULL THEN 2 ELSE 0 END 'Dec'
From YourTable
) x

答案 2 :(得分:0)

这就是你想要的吗?

declare @cmd varchar(2000) = 'select ' + '

   ISNULL([Jan], 0) +ISNULL([Feb], 1) + ISNULL([Mar], 3) + ISNULL([Apr], 0)
 + ISNULL([May], 0) +ISNULL([Jun], 0) + ISNULL([Jul], 0) + ISNULL([Aug], 1)
 + ISNULL([Sep], 0) +ISNULL([Oct], 3) + ISNULL([Nov], 0) + ISNULL([Dec], 2)

' + ' from YourTableName';

execute (@cmd);

或:

declare @cmd varchar(2000) = 'select ' + (select ColumnName from YourTableName) + ' from YourTableName';

execute (@cmd);