source

과학적 표기 없이 SQL Server에서 float를 varchar로 변환

manysource 2023. 7. 4. 21:59

과학적 표기 없이 SQL Server에서 float를 varchar로 변환

과학적 표기법 및 소수점 자르기 없이 SQL Server에서 float를 varchar로 변환합니다.

예:

저는 float1000.2324422를 가지고 있고, 같은 1000.2324422와 같은 varchar로 변환될 것입니다.

소수점 이하의 값은 얼마든지 있을 수 있습니다...부동 소수점 값이 랜덤으로 표시됩니다.

으로 전환VARCHAR(MAX)또는 항상 '1.67383e+008'로 나오는 167382981과 같은 큰 정수(플로트 필드)를 사용하는 경우에는 다른 어떤 것도 작동하지 않았습니다.

효과가 있었던 것은STR().

둘 다 아니다.str()또는cast(float as nvarchar(18))저를 위해 일했습니다.

결국 작동한 것은 int로 변환한 다음 nvarchar로 변환한 것입니다.

 convert(nvarchar(18),convert(bigint,float))

STR 기능이 제대로 작동합니다.계산을 좀 한 후에 플로트가 돌아와서 VARCHAR로 변경해야 했는데, 무작위로 과학적 표기도 받고 있었습니다.저는 모든 계산 끝에 다음과 같은 변화를 만들었습니다.

 ltrim(rtrim(str(someField)))

ㅠㅠCAST(CAST(@value AS bigint) AS varchar)

효과:

CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))

사용해 보십시오.

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(CAST(CAST(YOUR_FLOAT_COLUMN_NAME AS DECIMAL(18,9)) AS VARCHAR(20)),'0',' ')),' ','0'),'.',' ')),' ','.') FROM YOUR_TABLE_NAME
  1. DECTION으로 캐스팅하면 이전에 값이 있었는지 여부에 관계없이 모든 값에 소수점이 표시됩니다.
  2. VARCHAR로 주조하면 REPLACE 기능을 사용할 수 있습니다.
  3. 먼저 0을 공백으로 바꾼 다음 RTRIM을 사용하여 모든 후행 공백(이전의 0)을 제거한 다음 나머지 공백을 0으로 바꿉니다.
  4. 그런 다음 소수점 값이 없는 숫자에 대해서도 같은 기간을 사용하여 제거합니다.

소수점 때문에 이 특정 사례와 관련이 없지만 제목을 검색하는 사람에게 도움이 될 수 있습니다.정수 필드는 미세하게 막대형으로 변환되지만 부동 소수점은 과학적 표기법으로 변경됩니다.따라서 소수점 이하가 없는 경우 빠르게 부동소수점을 변경하는 방법은 먼저 필드를 정수로 변경한 다음 막대로 변경하는 것입니다.

STR() 함수를 사용하면 공백이 생길 수 있기 때문에 다음과 같이 FORMAT() 함수를 사용합니다.

SELECT ':' + STR(1000.2324422), ':' + FORMAT(1000.2324422,'##.#######'), ':' + FORMAT(1000.2324422,'##')

위 코드의 결과는 다음과 같습니다.

:      1000 :1000.2324422   :1000

아래는 과학적 표기법 없이 부동값을 변환할 수 있는 예입니다.

DECLARE @Floater AS FLOAT = 100000003.141592653

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SET @Floater = @Floater * 10

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SET @Floater = @Floater * 100

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SELECT LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
      ,FORMAT(@Floater, '')

위의 예에서 우리는 format 함수가 우리에게 유용하다는 것을 알 수 있습니다. FORMAT() 함수는 항상 nvarchar를 반환합니다.

다음 코드를 사용할 수 있습니다.

STR(<Your Field>, Length, Scale)

필드 = 변환할 부동 필드

길이 = 소수점이 있는 부동 소수점의 총 길이

척도 = 소수점 뒤 길이의 수

예:

SELECT STR(1234.5678912,8,3)

결과: 1234.568

마지막 자리도 반올림됩니다.

데이터를 매우 잘 테스트해야 합니다.이것은 지저분해질 수 있습니다.다음은 단순히 값에 10을 곱한 결과의 예입니다.실행하여 결과를 확인합니다.세 번째 쿼리에서 SQL Server 2017 상자에 여러 개의 *******가 표시됩니다.BIGINT로 캐스팅하면 매번 효과가 있을 겁니다.그러나 충분한 데이터를 테스트하지 않고 충분한 데이터를 테스트하지 않으면 나중에 문제가 발생할 수 있으므로 최대 기대값을 테스트하지 않는 한 모든 데이터에 적용될 것이라고 생각하지 마십시오.

 Declare @Floater AS FLOAT =100000003.141592653
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

    SET  @Floater =@Floater *10
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

    SET  @Floater =@Floater *100
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

꽤 많은 답변이 있지만 변환 시나리오를 수용할 만큼 완벽한 답변은 없었습니다.FLOAT안으로NVARCHAR그래서 여기 있습니다.

다음과 같은 결과를 얻었습니다.

DECLARE @f1 FLOAT = 4000000
DECLARE @f2 FLOAT = 4000000.43

SELECT TRIM('.' FROM TRIM(' 0' FROM STR(@f1, 30, 2))),
       TRIM('.' FROM TRIM(' 0' FROM STR(@f2, 30, 2)))
SELECT CAST(@f1 AS NVARCHAR),
       CAST(@f2 AS NVARCHAR)

출력:

------------------------------ ------------------------------
4000000                        4000000.43

(1 row affected)

                               
------------------------------ ------------------------------
4e+006                         4e+006

(1 row affected)

우리의 시나리오에서는FLOAT2개의 소수점까지 1달러의 양으로 충분했지만, 당신은 그것을 당신의 필요에 따라 쉽게 늘릴 수 있습니다.게다가, 우리는 반올림 숫자를 위해 ".00"을 잘라야 했습니다.

이 코드를 사용해 보십시오.

SELECT CONVERT(varchar(max), CAST(1000.2324422 AS decimal(11,2)))

결과:

1000.23

여기서 소수점(11,2): 총 11자리 수(소수점 제외), 소수점 다음 두 자리의 경우 2자리

이전의 답변은 저에게 없습니다.결국 저는 이것을 간단히 사용했습니다.

INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT CONCAT('#',CAST([Field_Name] AS decimal(38,0))) [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) = 1

INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) <> 1
select format(convert(float,@your_column),'0.0#########')

장점:이 솔루션은 소스 데이터 유형(플로트, 과학, 막대, 날짜 등)과 무관합니다.

String10자리로 제한됩니다.bigInt십진수 값을 제거합니다.

효과:

가정하다

dbo.AsDesignedBites.XN1E1 = 4016519.564`

다음 문자열의 경우:

'POLYGON(('+STR(dbo.AsDesignedBites.XN1E1, 11, 3)+'...

언급URL : https://stackoverflow.com/questions/6521354/convert-float-into-varchar-in-sql-server-without-scientific-notation