Хранилище данных Azure - исправление значения bigint в столбце типа данных Float - PullRequest
0 голосов
/ 17 января 2019

У меня есть столбец с типом данных float. Неверные данные со значением bigint. Значение -4.66606E+22.

Я попробовал следующую логику, но она не работает.

  1. Использование оператора case для проверки того, находится ли столбец между минимальным и максимальным диапазоном с плавающей запятой, если нет, измените его на 0.

  2. ISNULL (TRY_CAST (Column1 AS FLOAT), 0), но это не работает, поскольку у нас есть хранилище данных Azure.

Select 
    case 
        when Column1 > '1.79E+32' then 0
        when Column1 < '-1.79E+32' then 0
        Else Column1 
    End as Column1 
From Table1

Я тоже пытался

Select 
    case 
        when Column1 between '1.79E+32' and '-1.79E+32' then Column1 
        Else 0
    End as Column1 
From Table1

Ожидается замена -4.66606E+22 на 0.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Давайте начнем с диапазона BigInt: от -2 ^ 63 (-9,223,372,036,854,775,808) до 2 ^ 63-1 (9,223,372,036,854,775,807). Это примерно ± 9E + 18, поэтому -4,66606E + 22 маловероятно BigInt значение.

Переходя к сравнению значений разных типов данных:

declare @Foo as BigInt = 8765432109876543210;
declare @FloatFoo as Float(24) = @Foo, @DoubleFoo as Float(53) = @Foo;

-- According to the rules for data type preedence a BigInt value will be converted to a Float
--   when the two data types are compared. Hence all of the values are "equal".
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

-- Since a Float(53) has a precision of 15 digits that means some precision will be lost.
set @Foo += 1; -- Bump the BigInt value, but leave the Floats unchanged.
-- And ... the values are all still "equal"!
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

-- Once more, with feeling.
set @Foo += 1000; -- A bigger bump makes the Float(53) value different, but not the Float(24).
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

Ссылка: Приоритет типа данных , Float.

Резюме: «Имеются неверные данные со значением bigint. Значение -4.66606E+22.» Это действительно плохие данные. А сравнение значений BigInt и Float - неточное действие, которое может привести к разочарованию.

0 голосов
/ 18 января 2019

Диапазон bigint составляет от -2^63 (-9,223,372,036,854,775,808) до 2^63-1 .(9,223,372,036,854,775,807). И диапазон float составляет от - 1.79E+308 до -2.23E-308, 0 и 2.23E-308 до 1.79E+308

мы можем видеть здесь: enter image description here

Справка:

  1. с плавающей и реальной
  2. int, bigint, smallint и tinyint

Данные bigint -4.66606E+22 находятся в диапазоне с плавающей точкой. Вот почему ваш код не работает. И, как сказал HABO, нет смысла сравнивать число с плавающей точкой, например,

Вы хотите заменить -4.66606E + 22 на 0, возможно, вы можете попробовать:

Select
    case  Column1
        when  -4.66606E+22 then 0 
    End 
From Table1

Надеюсь, это поможет вам.

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