과학적 표기 없이 SQL Server에서 float를 varchar로 변환
과학적 표기법 및 소수점 자르기 없이 SQL Server에서 float를 varchar로 변환합니다.
예:
저는 float 값 1000.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
- DECTION으로 캐스팅하면 이전에 값이 있었는지 여부에 관계없이 모든 값에 소수점이 표시됩니다.
- VARCHAR로 주조하면 REPLACE 기능을 사용할 수 있습니다.
- 먼저 0을 공백으로 바꾼 다음 RTRIM을 사용하여 모든 후행 공백(이전의 0)을 제거한 다음 나머지 공백을 0으로 바꿉니다.
- 그런 다음 소수점 값이 없는 숫자에 대해서도 같은 기간을 사용하여 제거합니다.
소수점 때문에 이 특정 사례와 관련이 없지만 제목을 검색하는 사람에게 도움이 될 수 있습니다.정수 필드는 미세하게 막대형으로 변환되지만 부동 소수점은 과학적 표기법으로 변경됩니다.따라서 소수점 이하가 없는 경우 빠르게 부동소수점을 변경하는 방법은 먼저 필드를 정수로 변경한 다음 막대로 변경하는 것입니다.
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)
우리의 시나리오에서는FLOAT
2개의 소수점까지 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#########')
장점:이 솔루션은 소스 데이터 유형(플로트, 과학, 막대, 날짜 등)과 무관합니다.
String
10자리로 제한됩니다.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
'source' 카테고리의 다른 글
(단일) * 연산자는 이 루비 코드에서 무엇을 합니까? (0) | 2023.07.04 |
---|---|
knitr을 사용하여 마크다운을 위해 로컬 이미지의 크기를 설정하는 방법은 무엇입니까? (0) | 2023.07.04 |
Oracle PL/SQL - NO_DATA_Found 예외가 저장 프로시저 성능에 좋지 않습니까? (0) | 2023.07.04 |
Vuex 작업: 다른 작업 내의 작업 액세스(디스패치 없음, Promise.all을 연결해야 함) (0) | 2023.07.04 |
통화/화폐를 다루는 가장 좋은 방법은 무엇입니까? (0) | 2023.07.04 |