VARCHAR для преобразования чисел, научная запись, приводящая к ошибке преобразования - нужен совет - PullRequest
0 голосов
/ 15 мая 2019

Ранее у меня была похожая тема, которая превратилась в сложную проблему, которая, как мне кажется, не имеет реального решения.Надеюсь, я ошибаюсь, но вот суть.

Я определил типы данных для каждого члена таблицы как Varchar (80).Затем я загружаю данные из внешней системы (Oracle PBCS) в плоский файл с помощью инструмента интегратора, который загружает данные в таблицу.

Посредством процесса преобразования SQL - я преобразую или преобразовываю данные из varchar вчисловой или десятичный.Когда я делаю это, я получаю ошибку на некоторых значениях.С помощью запроса try_cast - я вижу, что является причиной того, что я не могу привести или преобразовать в числовое или десятичное число.

Извлечение загружает эти значения в научную запись - не уверен, почему исходная система полностью это делает - поэтому ярешил попытаться контролировать это в SQL - но, к сожалению, ничего не работает, так как мне нужно сначала преобразовать в число с плавающей точкой, прежде чем я преобразую в числовое или десятичное число.Для очень маленьких значений, таких как 6.27e ^ -19 - мой float просто уменьшает долю цента до 0 - в общем, float кажется очень плохой идеей для валюты.

Если я сохраню try_cast, тогда явернет нулевые значения - я действительно не могу этого сделать.

См. код ниже

1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11
1.455191522836685e-11

Это мои проблемы с помощью try_cast.

select 
   t.[acct_20010]
   --convert(numeric(19,4), convert(float, t.[acct_20010]))
  --cast( cast(t.[acct_20010] as float) as decimal(18,10))
  -- ,CAST([Obligated] AS FLOAT)  
  --  ,CAST([Total_Expended] AS FLOAT)     
              --  ,CAST([Total_Obligated_FAMIS] AS FLOAT)
    --,CAST([Spendplan_Balance] AS FLOAT)
    --,CAST([Pending_Expenditures] AS FLOAT)
     --           ,CAST([Unexpended_Balance] AS FLOAT)
    --,CAST([Funds_Remaining_by_BBFY] AS FLOAT)
    --,CAST([PY_Funds_Remaining] AS FLOAT)
--select t.[expended]
--from 
from
(select [acct_20010] as [acct_20010]
--,[obligated],
--Total_Expended
FROM [BFS_DM].[Source].[Cld_Ess_SpendPln] where ([acct_20010] is not null and [acct_20010] <> '#missing'))  t
where TRY_CAST(t.[acct_20010] AS NUMERIC(18,4)) IS NULL

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

Если бы я загрузил файл в таблицу с правильными типами данных - он бы даже принял научное записанное значение?

1 Ответ

0 голосов
/ 15 мая 2019

Экспоненциальная запись недопустима для преобразования строки в число. Учтите следующее:

select try_cast('1.455191522836685e-11' AS numeric(18,4))
select try_cast('1.455191522836685e-1' AS numeric(18,4))
select try_cast('1.455191522836685' AS numeric(18,4))

Только последний работает, потому что у него нет явного показателя степени.

Вы можете исправить это, если необходимо, сначала преобразовав в число с плавающей точкой, а затем в числовое значение:

select try_cast(try_cast('1.455191522836685e-11' as float) AS numeric(18,4))
select try_cast(try_cast('1.455191522836685e-1' as float) AS numeric(18,4))
select try_cast(try_cast('1.455191522836685' as float) AS numeric(18,4))

Но следите за точностью - в первом примере вы получите 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...