DECIMAL(9,6)
999,123456과 같은 값을 지원 하는 열이 있습니다 .
하지만 123,4567과 같은 데이터를 삽입하면 123,456700이됩니다.
그 0을 제거하는 방법?
DECIMAL(9,6)
999,123456과 같은 값을 지원 하는 열이 있습니다 .
하지만 123,4567과 같은 데이터를 삽입하면 123,456700이됩니다.
그 0을 제거하는 방법?
답변:
A decimal(9,6)
는 쉼표 오른쪽에 6 자리 숫자를 저장합니다. 후행 0을 표시할지 여부는 일반적으로 클라이언트 측에서 구현되는 형식 지정 결정입니다.
그러나 SSMS는 float
후행 0이없는 형식이므로 decimal
를 a 로 캐스트하여 후행 0을 제거 할 수 있습니다 float
.
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
인쇄물:
123.456700 123,4567
(내 소수점 구분 기호는 쉼표이지만 SSMS는 소수점으로 소수점 형식을 지정합니다. 분명히 알려진 문제 입니다.)
FORMAT()
함수 (SqlAzure 및 Sql Server 2012+)를 사용할 수 있습니다 .
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
FLOAT (또는 REAL)와 함께 사용할 때는주의하십시오. g17
또는 더 크게 (또는 g8
REAL과 함께 또는 더 크게) 사용하지 마십시오 . 기계 표현의 제한된 정밀도로 인해 원하지 않는 효과가 발생하기 때문입니다.
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
또한 문서 에 따르면 다음 사항에 유의하십시오 .
FORMAT은 .NET Framework CLR (공용 언어 런타임)의 존재 여부에 의존합니다. 이 기능은 CLR의 존재 여부에 따라 달라 지므로 원격되지 않습니다. CLR이 필요한 기능을 원격으로 수행하면 원격 서버에서 오류가 발생합니다.
SqlAzure에서도 작동합니다.
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
나는 float가 표현할 수있는 것보다 더 많은 숫자가 내 십진수에있을 가능성이 있기 때문에 float로 캐스팅하는 것을 꺼렸다.
FORMAT
표준 .net 형식 문자열 'g8'과 함께 사용하면 부적합한 매우 작은 소수 (예 : 1e-08)의 경우 과학적 표기법을 반환했습니다.
사용자 지정 형식 문자열 ( https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings )을 사용하여 원하는 것을 얻을 수있었습니다.
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
숫자 뒤에 0이 하나 이상 있어야하므로 2.0이 2가되지 않도록하려면 다음과 같은 형식 문자열을 사용하십시오. 0.0#####
소수점은 지역화되어 있으므로 쉼표를 소수점 구분 기호로 사용하는 문화권에서는. 이다
물론 이것은 데이터 레이어가 형식을 지정하는 것은 좋지 않습니다. (하지만 제 경우에는 다른 레이어가 없습니다. 사용자는 말 그대로 저장 프로 시저를 실행하고 결과를 이메일에 넣습니다 : /)
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
인쇄물:
2.55
이 시도 :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
20.55 제공
0.000
는 .
. 여기에 SELECT REPLACE(RTRIM(REPLACE(20.5500, "0", " ")), " ", "0")
후행 0 만 트리밍 하는 수정 사항 이 있습니다
비슷한 문제가 있었지만 소수점이없는 소수점을 제거해야했습니다. 여기에 소수점을 구성 요소로 분할하고 소수점 문자열에서 가져온 문자 수를 분수 성분 (Case 사용 안함). 문제를 더욱 흥미롭게하기 위해 내 숫자는 소수점없이 부동 소수점으로 저장되었습니다.
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
결과는 고통 스럽지만 위의 답변에서 많은 도움을 받아 거기에 도달했습니다.
가장 좋은 방법은 정밀도를 잃을 가능성이 있으므로 변환하기 전에 FLOAT 또는 MONEY 로 변환하지 않는 것입니다 . 따라서 안전한 방법은 다음과 같습니다.
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
@value 될 수있는 임의의 소수 (X, Y)
sp_
경우 저장 프로 시저, fn_
함수, tbl
테이블 등에 사용합니다. on ... 이것은 필수 사항은 아니지만 데이터베이스를 구성하는 모범 사례입니다.
비슷한 문제가 있었는데, 다음과 같은 숫자에서 후행 0을 잘라 내야했습니다. xx0000,x00000,xxx000
나는 다음을 사용했다 :
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
코드는자를 번호가있는 필드의 이름입니다. 이것이 다른 사람에게 도움이되기를 바랍니다.
내 소수에서 후행 0을 제거하여 선행 0 만있는 특정 길이의 문자열을 출력 할 수 있어야했습니다.
(예 : 142.023400이 000000142.0234가되도록 14자를 출력해야했습니다),
parsename
, reverse
및 cast
as int
후행 0을 제거하기 위해 사용했습니다 .
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(그런 다음 내 선행 0을 얻으려면 위의 길이에 따라 올바른 수의 0을 복제하고이를 위의 앞쪽에 연결할 수 있습니다)
나는 이것이 누군가에게 도움이되기를 바랍니다.
TSQL에서 선행 및 후행 0을 제거 할 수 있습니다.
문자열이 아닌 경우 STR TSQL 함수를 사용하여 문자열로 변환 한 다음
선행 및 후행 0 제거
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
포럼에 대한 추가 정보 .
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
나는 이것이 오래된 게시물이라는 것을 이해하지만 내가 생각해 낸 SQL을 제공하고 싶습니다.
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
가장 쉬운 방법은 값을 FLOAT로 캐스트 한 다음 문자열 데이터 유형으로 변환하는 것입니다.
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
이 시도:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
이 스레드는 매우 오래되었지만 SQL Server 2012 이상을 사용하지 않거나 어떤 이유로 든 FORMAT 기능을 사용할 수없는 경우 다음과 같이 작동합니다.
또한 숫자가 1보다 작 으면 많은 솔루션이 작동하지 않았습니다 (예 : 0.01230000).
다음은 음수에서는 작동하지 않습니다.
DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
각각 10.012345 및 0.012345를 반환합니다.
이 시도:
select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
999999
되며 OP는 후행 0을 제거하도록 요청합니다.
DECIMAL (9,6) 열은 정밀도 손실없이 float로 변환되므로 CAST (... AS float)가 트릭을 수행합니다.
@HLGEM : float는 숫자를 저장하는 데 적합하지 않으며 "Never use float"는 정확하지 않다고 말합니다. 숫자 만 알면됩니다. 예를 들어 온도 측정은 float로 잘 진행됩니다.
@abatishchev 및 @japongskie : 필요하지 않은 경우 SQL 저장 procs 및 함수 앞에 접두사를 사용하는 것이 좋습니다. 언급 한 링크는 사용하지 않아야하는 저장 프로 시저에 "sp_"접두사를 사용하지 않도록 지시 할뿐입니다. 다른 접두사는 "usp_"또는 "spBob_"과 같이 괜찮습니다.
참조 : "유효 십진수가 6 개 이하인 모든 정수는 정밀도 손실없이 IEEE 754 부동 소수점 값으로 변환 될 수 있습니다.": https://en.wikipedia.org/wiki/Single-precision_floating-point_format