1

Я импортировал текстовый файл в моем столбце таблицы B, которое имеет тип данных VARCHAR данные как 10.00 ГБ, 20 ТБ, 100 МБ и т.д.SQL столбец обновление от типа VARCHAR данных в целое

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

я сделал try convert (int, имя столбца), который возвратил ошибку, не может преобразовать тип данных varchar в тип int

Я могу заменить GB пробелами, но хочу конвертировать что-либо с Tb или MB, чтобы преобразовать его в GB. да, я не хочу, чтобы TB или GB или MB отображались в моей колонке B. Просто цифры.

может быть хорошим, если я могу сохранить эти значения в отдельном столбце с типом данных как int, а затем удалить исходный столбец в той же таблице.

Пожалуйста, может кто-то помочь

+1

всегда хранить данные в одном формате и прикладного уровня может показать в соответствующем формате, нет необходимости хранить единицы в базе данных. Также сначала проверьте, можете ли вы получить данные в csv в отдельных единицах, поэтому вам не нужно делать какие-либо преобразования в SQL-слое. – radar

+0

Я согласен, я пытаюсь создать базу данных управления пропускной способностью для автоматизации функций. В идеале я просто получаю плоские файлы, а затем попытаюсь их преобразовать, чтобы другие команды не выполняли дополнительную работу. – user4227443

ответ

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; 

EDIT:

Вы могли бы иметь проблемы, если все значения не в формате, который вы ожидаете. Вы можете подать заявление, например:

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

, чтобы убедиться, что число действительно находится в начале строки.

+0

I получите ошибку, говоря неправильный синтаксис рядом с. Мне нужно запустить оба утверждения, чтобы достичь этого? – user4227443

+0

Разделение работает, однако, где в вашем коде он говорит как int, я должен был сделать это как varchar и работать красиво.нужно будет попробовать вторую часть кода, которая является моей главной статьей – user4227443

+0

@ user4227443. , , Я действительно проверил код на (очень ограниченном) наборе примеров. Ваши значения могут не соответствовать формату. См. Редактирование, которое я только что сделал. –

0

Не было бы лучше хранить тип размера файла в отдельном столбце

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

Поскольку я экспортировал из txt-файла, столбцы содержали эти значения вместе. Однако мне все равно нужно преобразовать все TB, MB в GB, которые похожи на обычный тип.

Я также должен найти сумму столбца Ь для каждого хоста

идеально у меня есть потенциал, присвоенный каждому, и я пытаюсь найти сумму мощности для каждого хоста ,

1

Я знаю, что 1000 не такой же, как 1024, но в зависимости от ваших конкретных нужд, это довольно простой метод:

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

+0

Это все еще не позволяет сказать, что преобразование не удалось при попытке конвертировать значение varchar 35.000000 в тип данных int.In ответ @Gordon Linoff, будет ли он работать, где мой текущий тип данных столбца - это varchar? Am, используя SQL Server Express 2008. – user4227443

+0

Я добавил ' КРУГЛЫЙ, чтобы обойти это ... – paul