[SQL] SQL Server의 진수에서 0을 후행 제거
SQLSQL Server의 진수에서 0을 후행 제거
I는 열 DECIMAL (9,6), 즉 그것이 999,123456 같은 값을 지원있다.
내가 123,4567 같은 데이터를 삽입 할 때 그러나 123,456700된다
어떻게 그 0을 제거하는 방법?
해결법
-
==============================
1.소수 (9,6)이 쉼표의 오른쪽 6 자리를 저장한다. 디스플레이 후행 제로에 대한 여부는 일반적으로 클라이언트 측에서 구현 된 형식을 결정합니다.
소수 (9,6)이 쉼표의 오른쪽 6 자리를 저장한다. 디스플레이 후행 제로에 대한 여부는 일반적으로 클라이언트 측에서 구현 된 형식을 결정합니다.
하지만 0을 후행하지 않고 SSMS 형식 플로트 때문에, 당신은 부동의 진수를 캐스트 제로 후행 제거 할 수 있습니다 :
select cast(123.4567 as DECIMAL(9,6)) , cast(cast(123.4567 as DECIMAL(9,6)) as float)
인쇄물:
123.456700 123,4567
(내 소수 구분은 쉼표 아직 SSMS는 점이 진수 포맷. 명백하게 알려진 문제).
-
==============================
2.당신은 FORMAT () 함수 (SqlAzure 및 SQL Server를 2012+)를 사용할 수 있습니다 :
당신은 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)을 사용하는 경우주의 : 기계 표현의 제한된 정밀도가 원치 않는 효과가 발생하기 때문에, (REAL 또는 G8 이상) G17 이상을 사용하지 마십시오 :
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'
또한, 설명서에 따라, 그주의 :
도 SqlAzure에서 작동합니다.
-
==============================
3.
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
-
==============================
4.나는 플로트 대표 할 수있는 것보다 더 많은 숫자가 내 소수에 있어야하기 때문에 잠재력을 떠 캐스팅하기를 꺼려했다
나는 플로트 대표 할 수있는 것보다 더 많은 숫자가 내 소수에 있어야하기 때문에 잠재력을 떠 캐스팅하기를 꺼려했다
표준 .NET 형식 문자열 'G8'와 함께 사용하면 FORMAT 아주 작은 소수의 경우에 과학적 표기법을 반환 (예를 들어, 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
당신이 당신의 수는 적어도 하나의 제로 후행 가지고 싶다면, 그래서 2.0이 될 0.0과 같은 형식 문자열을 사용하지 않습니다 #####
소수 구분으로 콤마를 사용해 배양 콤마 출력을 발생할 수 있도록 소수점은 지역화. 이다
물론,이 서식하고있는 데이터 층을 갖는의 discouragable 연습이다 (그러나 다른 계층이없는 내 경우에는, 사용자가 문자 그대로 저장 프로 시저를 실행하고 이메일로 결과를두고있다 : /)
-
==============================
5.
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
인쇄물:
2.55
-
==============================
6.
Cast(20.5500 as Decimal(6,2))
그것을해야한다.
-
==============================
7.나는 그 구성 요소로 소수를 분리 솔루션, 염기에게 그것의 길이에 소수점 문자열에서 소요 문자 수 있었다 여기에, 비슷한 문제를 가지고 있지만 소수가 존재하지 않는 경우도 소수점을 제거하기 위해 필요했다 (케이스를 사용하지 않고) 분수 성분. 문제가 더 흥미로운 만들기 위해, 내 번호는 소수점없이 플로트로 저장했다.
나는 그 구성 요소로 소수를 분리 솔루션, 염기에게 그것의 길이에 소수점 문자열에서 소요 문자 수 있었다 여기에, 비슷한 문제를 가지고 있지만 소수가 존재하지 않는 경우도 소수점을 제거하기 위해 필요했다 (케이스를 사용하지 않고) 분수 성분. 문제가 더 흥미로운 만들기 위해, 내 번호는 소수점없이 플로트로 저장했다.
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')
그 결과 알아, 고통스러운, 그러나 나는 위의 답변에서 많은 도움을 수 있었을 것입니다.
-
==============================
8.가장 좋은 방법은 때문에 정밀도의 손실의 기회로 전환하기 전에 FLOAT 또는 MONEY로 변환되지 않습니다. 그래서 안전한 방법은 다음과 같이 할 수있다 :
가장 좋은 방법은 때문에 정밀도의 손실의 기회로 전환하기 전에 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)의
-
==============================
9.나는 xx0000, x00000, xxx000 같은 번호에서 0을 후행 트림에 필요한 비슷한 문제가 있었다
나는 xx0000, x00000, xxx000 같은 번호에서 0을 후행 트림에 필요한 비슷한 문제가 있었다
내가 사용 :
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
코드 트리밍 할 수와 필드의 이름입니다. 이 다른 사람을 도움이되기를 바랍니다.
-
==============================
10.또 다른 옵션은 ...
또 다른 옵션은 ...
나는 이것이이지만이 작동하는 것 같다 및 플로트를 통해 이동하지 않는 방법 효율적인 모른다 :
select replace(rtrim(replace( replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0') , '.', ' ')), ' ', '.')
어떤 진수가없는 경우 중간 선은 바깥이 개 제거에게, 후행 공백 오프 지점을 제거합니다
-
==============================
11.나는 출력 만 0을 선두에 추가해, 특정 길이의 문자열 내가 할 수 있도록 내 소수에 0을 후행 제거하기 위해 필요
나는 출력 만 0을 선두에 추가해, 특정 길이의 문자열 내가 할 수 있도록 내 소수에 0을 후행 제거하기 위해 필요
(예를 들어, 나는 142.023400이 000000142.0234 될 것이라고 14 개 문자를 출력에 필요)
나는 후행 0을 제거하기 위해 리버스 int로서 캐스트, parsename을 사용 :
SELECT PARSENAME(2.5500,2) + '.' + REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(TO는 내가 위의 길이에 따라 0의 정확한 수를 복제하고 위의 전면이를 연결할 수있는 내 앞에 0을 얻을)
나는이 사람을 도움이되기를 바랍니다.
-
==============================
12.SQL에서 선행 및 후행 0을 제거 할 수
SQL에서 선행 및 후행 0을 제거 할 수
-
==============================
13.이 시도 :
이 시도 :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
20.55를 제공합니다
-
==============================
14.이건 어때? @thisData로 함수에 들어오는 데이터를 가정 :
이건 어때? @thisData로 함수에 들어오는 데이터를 가정 :
BEGIN DECLARE @thisText VARCHAR(255) SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0') IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.' RETURN STUFF(@thisText, LEN(@thisText), 1, '') RETURN @thisText END
-
==============================
15.
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
-
==============================
16.나는 이것이 이전 게시물 이해하지만 내가 생각 해낸 것이 SQL을 제공하고 싶습니다
나는 이것이 이전 게시물 이해하지만 내가 생각 해낸 것이 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
-
==============================
17.이 시도.
이 시도.
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
-
==============================
18.가장 쉬운 방법은 CAST에 FLOAT로 다음 문자열 데이터 형식의 값입니다.
가장 쉬운 방법은 CAST에 FLOAT로 다음 문자열 데이터 형식의 값입니다.
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
-
==============================
19.이 시도:
이 시도:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
-
==============================
20.나는이 스레드가 매우 오래지만 사람들을 위해 SQL 서버 2012를 사용하지 않거나 위 또는 다음 작품을 어떤 이유로 FORMAT 기능을 사용할 수 없습니다 알고있다.
나는이 스레드가 매우 오래지만 사람들을 위해 SQL 서버 2012를 사용하지 않거나 위 또는 다음 작품을 어떤 이유로 FORMAT 기능을 사용할 수 없습니다 알고있다.
숫자 (예를 들어 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를 돌려줍니다.
-
==============================
21.이 시도:
이 시도:
select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
-
==============================
22.소수 (9,6) 컬럼은 CAST (... AS 플로트) 트릭을 할 것입니다 때문에, 정밀도의 손실없이 떠 변환합니다.
소수 (9,6) 컬럼은 CAST (... AS 플로트) 트릭을 할 것입니다 때문에, 정밀도의 손실없이 떠 변환합니다.
@HLGEM : 그 플로트 말은 "결코 사용 플로트를"번호를 저장하고 대한 빈약 한 선택 정확하지 않습니다 - 당신은 그냥 예를 들어, 귀하의 번호를 알고있다 온도 측정은 수레로 잘 갈 것입니다.
@abatishchev 및 @japongskie은 : 필요하지 않은 경우 SQL 저장 발동과 기능의 앞에 접두사는 여전히 좋은 생각입니다; 만 언급 한 링크를 사용하지 않아야 저장 프로 시저에 대해 "SP_"접두사를 사용하지 않도록 지시, 다른 접두사는 예를 들어, 괜찮 "usp_"또는 "spBob_"
참고: "6 개 이하의 중요한 진수 모든 정수 정밀도의 손실없이 IEEE 754 부동 소수점 값으로 변환 할 수있다"https://en.wikipedia.org/wiki/Single-precision_floating-point_format
from https://stackoverflow.com/questions/2938296/remove-trailing-zeros-from-decimal-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] "절에"내 항목의 MySQL의 수 (0) | 2020.03.23 |
---|---|
[SQL] MySQL의 : 그룹 함수의 잘못된 사용 (0) | 2020.03.23 |
[SQL] PostgreSQL의 기능의 언어 SQL 및 언어 plpgsql의 차이 (0) | 2020.03.23 |
[SQL] SQL 서버 : GROUP BY 절에 쉼표로 구분 된 값을 얻을 [중복] (0) | 2020.03.23 |
[SQL] MySQL의에서 "전체 단어 일치"검색 (0) | 2020.03.23 |