从varchar数据类型到int的SQL更新列

时间:2014-11-07 15:05:26

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2008-express

我将一个txt文件导入到我的表列B中,该列是数据类型varchar 数据类似于10.00 GB,20 TB,100 MB等

column a     column b
host A       100 TB
host B       20 GB
host C       100 MB

我确实尝试了convert(int,column name),返回错误建议无法将数据类型varchar转换为int类型

我可以用空格替换GB,但想要将任何用Tb或MB转换为GB的东西。是的,我不希望TB或GB或MB显示在我的专栏B.正在编号。

如果我可以将这些值存储在数据类型为int的单独列中,然后在同一个表中删除我的原始列,那么

可能会很好。

请有人帮忙

4 个答案:

答案 0 :(得分:3)

您可以使用以下方式拆分列:

select t.a, t.b,
       cast(left(b, charindex(' ', b)) as int) as num,
       right(b, 2) as units
from t;

这假设值都是这种格式。

您可以使用乘法将其放在一列中:

select t.a, t.b,
       (cast(left(b, charindex(' ', b)) as float) *
        (case right(b, 2) when 'GB' then 1.0
                            when 'TB' then 1024.0
                            when 'MB' then 1.0/1024
                            else 1.0
         end)) as inGB
from t;

编辑:

如果所有值都不是您期望的格式,则可能会出现问题。您可以使用案例陈述,例如:

case when b like '[0-9] %' or b like '[0-9][0-9] %' or b like '[0-9][0-9][0-9] %' then . . .

验证数字实际上是在字符串的开头。

答案 1 :(得分:1)

由于我从txt文件导出,所以列包含这些值。 但是我仍然需要将所有TB的MB转换为GB,这就像普通类型。

我还需要找到每个主机的列b总和

理想情况下,我有分配给每个人的容量,我正在尝试找到每个主机的容量总和。

答案 2 :(得分:1)

我知道1000与1024不同,但根据您的确切需求,这是一个非常简单的方法:

select cast(ROUND(replace(replace(replace(columnB, ' TB', '000000000'), ' GB', '000000'), ' MB', '000') ,0,1) as int) from t

答案 3 :(得分:0)

将文件大小类型存储在单独的列中是不是最好

column a     column b    column c
host A       100         TB
host B       20          GB
host C       100         MB