SQL - вернуть все значения с плавающей запятой в поле без записи в экспоненциальном представлении

У меня есть столбец с чрезвычайно большим набором значений (> 21k) с неопределенным количеством десятичных знаков, некоторые существующие данные образца (FLOAT):

6.46
0.784
8.05
86.4
2.64
0
2.14
1E-06
14.81
3.45
0.87243
0
1.12279
0
21.41
0.6243

Я хотел бы вернуть все значения, как показано, ЗА ИСКЛЮЧЕНИЕМ «1E-06» должно быть .000001; кроме того, любая научная запись должна быть в чисто десятичном формате.

Я попытался написать какой-то оператор CASE, где за «THEN» следует «CONVERT (varchar (100), CAST (@ testFloat AS decimal (38, x )))», где x — это количество sig figs, но мне не удалось получить правильное условие для оператора WHEN, вот моя лучшая попытка:

CASE
    WHEN @testFloat = 0 THEN @testFloat
    WHEN FLOOR(@testFloat*10) != @testFloat*10 THEN CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2)))
    WHEN FLOOR(@testFloat*100) != @testFloat*100 THEN CONVERT(varchar(100), CAST(@testFloat AS decimal(38,3)))
    *etc*
END

Почти уверен, что я даже не был на правильном пути....


person Paniom    schedule 15.02.2019    source источник
comment
Каков тип данных столбца?   -  person Gordon Linoff    schedule 15.02.2019
comment
Тип данных столбца — Float, а точнее «не нуль».   -  person Paniom    schedule 15.02.2019
comment
FLOAT не имеет реального представления о значащих цифрах в десятичной системе (в любом случае это округленные двоичные цифры), но в первом приближении select FORMAT(1e-6, '0.' + REPLICATE('#', 308)) может подойти. Это позволит полностью избежать нотации E за счет создания действительно громоздкой нотации для очень больших/маленьких чисел. (На практике 308 можно уменьшить, если ваши числа никогда не будут такими экстремальными, что, возможно, ускорит форматирование.)   -  person Jeroen Mostert    schedule 15.02.2019
comment
@JeroenMostert Я понял, что sig figs на самом деле даже не моя проблема, поскольку .000001 в любом случае имеет только 1 sig fig. Я удалил эту часть моего заголовка. Во-вторых, это образец очень большой таблицы, которая в настоящее время имеет >21 тыс. строк. Я надеюсь написать запрос, который обрабатывал бы все значения в этом столбце, как описано выше, просто означая, что все значения не отображают научную запись, независимо от того, насколько маленькое (или большое) значение).   -  person Paniom    schedule 15.02.2019
comment
Что ж, с 308 знаками # даже самые маленькие (или самые большие) значения не будут использовать экспоненциальное представление, поскольку оно охватывает весь диапазон FLOAT. (Хотя, если подумать, это просто крайние показатели степени - вам нужно больше значений для мантиссы в крайнем конце. Сделайте его 400, чтобы быть уверенным, почему бы и нет...) Я не знаю более короткого выражения что позволит добиться того же эффекта. FORMAT использует строки формата .NET, задокументированные здесь, если вы хотите попробовать сами.   -  person Jeroen Mostert    schedule 15.02.2019
comment
@dnoeth: на самом деле это не обязательно - один 0 или # позаботится о части до десятичной точки, независимо от того, насколько она велика. После периода это другая игра.   -  person Jeroen Mostert    schedule 15.02.2019
comment
Упс, конечно, ты прав.   -  person dnoeth    schedule 15.02.2019
comment
@JeroenMostert - кажется, я вижу, где я был сбит с толку, и общение прерывается. Там, где вы написали 1e-6 в своем фрагменте кода, я бы просто вставил нужное поле, верно? После выходных попробую ваше решение. Если вы уверены в своем решении, я бы написал его как ответ, в любом случае это скоро будет помечено как «разговор».   -  person Paniom    schedule 16.02.2019


Ответы (1)


Комментарий Jeroen был полезен и дал мне выражение, которое дало мне желаемые результаты:

select FORMAT([sampleField], '0.' + REPLICATE('#', 308))

Где я думаю, что мне просто нужно уменьшить «308» до числа, которое представляет самый высокий уровень точности, наблюдаемый в наших процессах. Спасибо Jeroen за это решение!

person Paniom    schedule 18.02.2019