бросить или преобразовать поплавок в nvarchar? - PullRequest
24 голосов
/ 03 февраля 2011

Мне нужно выбрать из одного столбца типа данных с плавающей запятой и вставить его в другой столбец как nvarchar.

Я пытался разыграть это: cast([Column_Name] as nvarchar(50))

Результат был 9.07235e+009 вместо 10-значного номера (телефонный номер).

Кто-нибудь знает, как правильно привести или преобразовать эти данные?

Ответы [ 5 ]

32 голосов
/ 03 февраля 2011

Чек STR .Вам нужно что-то вроде SELECT STR([Column_Name],10,0) ** Это решение SQL Server, для других серверов проверьте их документы.

15 голосов
/ 03 февраля 2011

Если вы храните телефонные номера в столбце с плавающей запятой (что является плохой идеей), то они, вероятно, являются целыми числами и могут быть преобразованы в int перед приведением к nvarchar.

Так что вместо:

select cast(cast(1234567890 as float) as nvarchar(50))
1.23457e+009

Вы бы использовали:

select cast(cast(cast(1234567890 as float) as int) as nvarchar(50))
1234567890

В этих примерах самый внутренний cast(1234567890 as float) используется вместо выбора значения из соответствующего столбца.

Я действительно рекомендую не хранить телефонные номера в поплавках!
Что делать, если номер телефона начинается с нуля?

select cast(0100884555 as float)
100884555

Ой!Мы только что сохранили неверный номер телефона ...

9 голосов
/ 03 февраля 2011

Не использовать поплавки для хранения данных с фиксированной точностью и требуемой точностью. В этом примере показано, как правильно преобразовать число с плавающей точкой в ​​NVARCHAR (50), а также показано, почему не рекомендуется использовать числа с плавающей точкой для точных данных.

create table #f ([Column_Name] float)
insert #f select 9072351234
insert #f select 907235123400000000000

select
    cast([Column_Name] as nvarchar(50)),
    --cast([Column_Name] as int), Arithmetic overflow
    --cast([Column_Name] as bigint), Arithmetic overflow
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50))
from #f

выход

9.07235e+009    9072351234
9.07235e+020    907235123400000010000

Вы можете заметить, что второй вывод заканчивается на «10000», хотя данные, которые мы пытались сохранить в таблице, заканчиваются на «00000». Это связано с тем, что float тип данных имеет фиксированное число поддерживаемых значащих цифр, которое не распространяется так далеко.

1 голос
/ 22 июня 2018

Float не будет конвертироваться в NVARCHAR напрямую, сначала нам нужно конвертировать float в тип данных money, а затем конвертировать в NVARCHAR, см. Примеры ниже.

Пример1

SELECT CAST(CAST(1234567890.1234  AS FLOAT) AS NVARCHAR(100))

вывод

1.23457e+009

1009 * Пример2 * SELECT CAST(CAST(CAST(1234567890.1234 AS FLOAT) AS MONEY) AS NVARCHAR(100)) вывод 1234567890.12 В примере 2 значение конвертируется в число с плавающей точкой в ​​NVARCHAR

0 голосов
/ 10 ноября 2016

DECLARE @MyFloat [float]

SET @MyFloat = 1000109360.050

ВЫБРАТЬ ЗАМЕНУ (RTRIM (ЗАМЕНИТЬ (ЗАМЕНИТЬ (RTRIM ((ЗАМЕНИТЬ (CAST (CAST), 18)) AS VARCHAR (max)), '0', ''))), '', '0'), '.', '')), '', '.')

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