2016-07-13 4 views
0

У меня есть требование переместить данные столбца varchar в числовое, но с двумя условиями.Как преобразовать столбец Varchar в числовой

  1. Все буквенно-цифровые значения должны мигрировать в нуль
  2. Все десятичные значения должны, как это.

Я написал условие как WHERE data like '%[^0-9]%', он отлично работает для всех записей, за исключением десятичных.

Также у меня есть значения, такие как .001 abcd, это должно быть как null.

Резюмируя мне нужно:

1) 1234 as 1234 
2) 1.23 as 1.23 
3) ABC as null 
4) .ABC as null 
+0

HI! попробуйте это, выберите * из вашей таблицы WHERE ISNUMERIC (yourfield) = 1 –

+0

'ISNUMERIC' - это функция, которую никто никогда не просил и (довольно хорошо) никто не нуждается. Например. '1d1' и' £ 'считаются числами этой функцией, но ни одна из них не может быть преобразована в' int' или 'decimal()'. Они являются числовыми, потому что они могут быть преобразованы в * любые * числовых типов данных. Никто никогда не хочет раскрывать этот конкретный факт. –

ответ

2

Существует функцией по умолчанию в SQL Server ISNUMERIC() так, в первую очередь Проверьте значение данных, эта функция,

Select ISNUMERIC(DATA) 

Весь запрос является письменной п, как показано ниже,

SELECT CASE WHEN ISNUMERIC(data)=1 THEN CAST(data as decimal(18,2)) 
      ELSE NULL END as tData FROM DataTable 

По вашему вопросу, сначала мы должны преобразовать с числовым с помощью случая, который удовлетворяет ваше первое условие, другое дело, если значение строки, чем конвертировать в NULL. В вышеуказанном запросе оба условия были приняты.

EDIT: Если вы используете SQL SERVER 2012 или более поздней версии, чем использовать TRY_PARSE(), чем не будет никакой потребности беспокоиться об использовании СЛУЧАЙ тоже ...

Я попытался это,

SELECT TRY_PARSE('63.36' as decimal(18,2)) got result 63.36 

и

SELECT TRY_PARSE('.' as decimal(18,2)) got result NULL 
+0

Этот ответ не совсем прав. Это будет ошибкой, что 'SELECT ISNUMERIC ('.') - 1' – NEER

+0

@Sagar У меня значение +6000 в моем столбце varchar, функция ISNUMERIC рассматривает его как числовую, но в идеале это varchar, она будет вызывать ошибку если я попробую его нажать числовую колонку. – Ankit

+0

@Ankit: нашел лучший способ, пожалуйста, проверьте мой обновленный ответ. –

0

попробовать IsNumeric функцию,

SELECT ISNUMERIC('abc') 
SELECT ISNUMERIC('1.23') 
0

В SQL Server (версия 2012, 11.0.5343)

SELECT 
    CASE WHEN ISNUMERIC('.') = 1 THEN <Field> ELSE 0 END 
FROM 
    <Table> 

работает отлично ...

0

Тре является A blog post.

Попробуйте следующие

SELECT 
    CASE 
     WHEN 
      ISNUMERIC(data + 'e0') = 1 THEN CAST(data AS decimal(18,2)) 
     ELSE NULL END AS tData 
FROM 
    DataTable 
0

попробовать ISNUMERIC функция

DECLARE @MyTable TABLE(Val VARCHAR(100)) 

INSERT INTO @MyTable 
VALUES 
    ('1234') 
    ,('1.23') 
    ,('ABC') 
    ,('.ABC') 
    ,('MJA') 


Select Val as OldValue, 
     Case 
     When ISNUMERIC(Val) = 1 
     then Cast(Val as numeric(18,2)) 
     else null 
     end NewValue 
From @MyTable 

Выход

OldValue         NewValue 
----------------------------------------------------- 
    1234          1234.00 
    1.23          1.23 
    ABC          NULL 
    .ABC          NULL 
    MJA          NULL 

    (5 row(s) affected) 
2

Я думаю, что это соответствует вашей спецификации. Это является довольно громоздким, но, надеюсь, это разрушает условия достаточно, что это явно делать правильные вещи, или, если это не так, что это достаточно легко изменить:

declare @t table (data varchar(30)) 

insert into @t(data) values 
('1234'), 
('1.23'), 
('abc'), 
('.abc'), 
('+6000'), 
('1.2.3') 

select 
    CASE WHEN 
     Possible = 1 AND 
      (DecCheck = 0 OR 
      SingleDec = 1 
     ) THEN 
      CONVERT(decimal(12,3),data) 
     END 
from 
    @t t 
     cross apply 
      (select 
       --Only contains the correct characters 
       CASE WHEN not t.data like '%[^0-9.]%' THEN 1 ELSE 0 END as Possible, 
       --Contains a decimal point? (Needs more checks) 
       CASE WHEN CHARINDEX('.',t.data) > 0 THEN 1 ELSE 0 END as DecCheck, 
       CHARINDEX('.',t.data) as FirstDec --Where the first decimal point is 
      ) p 
     cross apply 
      (select 
       CASE WHEN DecCheck = 1 THEN 
        --Only contains one decimal point 
        CASE WHEN LEN(data) = FirstDec + CHARINDEX('.',REVERSE(data)) - 1 
         THEN 1 
        ELSE 0 END 
       ELSE 0 END as SingleDec 
      ) d 

Результаты:

data       
------------------------------ --------------------------------------- 
1234       1234.000 
1.23       1.230 
abc       NULL 
.abc       NULL 
+6000       NULL 
1.2.3       NULL 

Т.е. одна дополнительная проверка, которую вы можете использовать, заключается в том, что десятичная строка не может быть первым или последним символом в строке. Это достаточно легко сделать, добавив эти дополнительные проверки в первый CASE для столбца SingleDec.

+0

Действительно отличный ответ, его замечательная работа, проделанная вами, я должен сказать, что вы настоящий герой в SQL. Вы указали каждую вещь в своем запросе с помощью основных знаний о функциях. Шляпы для вашей работы ... –

Смежные вопросы