T- SQL Scientifi c преобразование поля обозначений - PullRequest
0 голосов
/ 13 января 2020

Я загружаю файл Excel в sql как varchar(max) и получил значение Scientifi c e, которое сейчас пытаюсь преобразовать в numeric, поскольку мне нужно сравнить это значение, и вот я столкнуться с проблемой.

Это главный вопрос: как и к какому типу я могу преобразовать это, чтобы сравнить со всем целочисленным значением?

На пи c Вы можете видеть, как это видно в Excel, даже отформатированный в текст, он каким-то образом все еще загружается в varchar (max), а не в строку символов. Это видно из моего кода теста.

enter image description here

DECLARE @C VARCHAR(MAX) = '1.1001562717e+011', @Nc VARCHAR(MAX) = '110015627174';  
SELECT @c, LEN(@c) LenC , 
      ISNUMERIC(@c) NumYN
---,  CAST(@c AS DECIMAL(38,2)) cDec   ---CAST(@c AS NUMERIC) cNum  --, CAST(@c AS BIGINT) cInt
WHERE @c LIKE '%[^0-9]%'
  AND ISNUMERIC(@c) = 1 

1 Ответ

1 голос
/ 13 января 2020

Для начала, ISNUMERIC - ужасная функция, она не дает хороших результатов; это часто неправильно. Если вы попробуете ISNUMERIC('1.1001562717e+011'), вы заметите, что вы получите значение 1, однако, CONVERT(numeric(13,1),'1.1001562717e+011') выдаст ошибку. Гораздо лучшая функция - TRY_CONVERT (или TRY_CAST), которая возвращает NULL, если преобразование не выполнено для спецификатора c типа данных: TRY_CONVERT(numeric(13,1),'1.1001562717e+011').

Существо здесь действительно важно указать c для типа данных, так как ISNUMERIC может (неверно) предполагать, что значение может быть преобразовано как минимум в 1 из числовых c типов данных; но это не значит, что все они. Для типов данных scientifi c единственным типом данных, который вы можете преобразовать, является float / real:

SELECT TRY_CONVERT(numeric(13,1),'1.1001562717e+011') AS Numeric,
       TRY_CONVERT(bigint,'1.1001562717e+011') AS int,
       TRY_CONVERT(float,'1.1001562717e+011') AS float,
       TRY_CONVERT(money,'1.1001562717e+011') AS money;

Обратите внимание, что здесь значение имеет только float. Если вы хотите numeric в качестве конечного значения, вам нужно CONVERT значение дважды:

CONVERT(numeric(13,1),TRY_CONVERT(float,'1.1001562717e+011'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...