복붙노트

[SQL] SQL Server의 진수에서 0을 후행 제거

SQL

SQL Server의 진수에서 0을 후행 제거

I는 열 DECIMAL (9,6), 즉 그것이 999,123456 같은 값을 지원있다.

내가 123,4567 같은 데이터를 삽입 할 때 그러나 123,456700된다

어떻게 그 0을 제거하는 방법?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.

    SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
    
  4. ==============================

    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. ==============================

    5.

    SELECT REVERSE(ROUND(REVERSE(2.5500),1))

    인쇄물:

    2.55
  6. ==============================

    6.

    Cast(20.5500 as Decimal(6,2))
    

    그것을해야한다.

  7. ==============================

    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. ==============================

    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. ==============================

    9.나는 xx0000, x00000, xxx000 같은 번호에서 0을 후행 트림에 필요한 비슷한 문제가 있었다

    나는 xx0000, x00000, xxx000 같은 번호에서 0을 후행 트림에 필요한 비슷한 문제가 있었다

    내가 사용 :

    select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
    

    코드 트리밍 할 수와 필드의 이름입니다. 이 다른 사람을 도움이되기를 바랍니다.

  10. ==============================

    10.또 다른 옵션은 ...

    또 다른 옵션은 ...

    나는 이것이이지만이 작동하는 것 같다 및 플로트를 통해 이동하지 않는 방법 효율적인 모른다 :

    select replace(rtrim(replace(
           replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
           , '.', ' ')), ' ', '.')
    

    어떤 진수가없는 경우 중간 선은 바깥이 개 제거에게, 후행 공백 오프 지점을 제거합니다

  11. ==============================

    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. ==============================

    12.SQL에서 선행 및 후행 0을 제거 할 수

    SQL에서 선행 및 후행 0을 제거 할 수

  13. ==============================

    13.이 시도 :

    이 시도 :

    SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
    

    20.55를 제공합니다

  14. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    17.이 시도.

    이 시도.

    select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
    
  18. ==============================

    18.가장 쉬운 방법은 CAST에 FLOAT로 다음 문자열 데이터 형식의 값입니다.

    가장 쉬운 방법은 CAST에 FLOAT로 다음 문자열 데이터 형식의 값입니다.

    CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
    
  19. ==============================

    19.이 시도:

    이 시도:

    select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
    
  20. ==============================

    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. ==============================

    21.이 시도:

    이 시도:

    select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
    
  22. ==============================

    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

  23. from https://stackoverflow.com/questions/2938296/remove-trailing-zeros-from-decimal-in-sql-server by cc-by-sa and MIT license