쉼표가있는 문자열 숫자 값을 소수 구분 기호로 NUMERIC (10, 2)로 변환


12

그리스어 형식의 숫자가 포함 된 varchar 열의 SQL 테이블이 있습니다 (. 천 단위 구분 기호 및 소수점 구분 기호로 쉼표로)

고전적인 전환

CONVERT(numeric(10,2),REPLACE([value],',','.'))

때문에 작동하지 않습니다. (천 단위 구분자) 변환을 종료

예를 들어보십시오

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

그런 값을 숫자로 변환하고 싶습니다 (10,2)

처리 방법에 대한 제안 사항이 있습니까?

답변:


10

( SQL Server 2012 이상 을 사용하는 경우보다 깔끔한 접근 방법은 @wBob의 답변 을 참조하십시오 . 아래 답변에 설명 된 방법은 SQL Server 2008 R2 이상을 사용하는 경우에만 필요합니다. )

NUMERIC쉼표, 마침표 또는 공백인지에 관계없이으로 변환 할 때 천 단위 구분 기호가 필요하지 않거나 원하지 않으므로 먼저 제거하십시오. 그런 다음 쉼표를 마침표 / 십진수로 변환하면 완료됩니다.

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

보고:

7000.45

완벽을 기하기 위해 나는 또한 시도했다는 것을 언급해야합니다.

  • SET LANGUAGE Greek;

  • CONVERT의 다양한 형식 스타일을보고 있지만 여기에는 적용되지 않습니다.

  • 포맷 기능을하지만, 입력 유형 (그래서 SQL 서버 2008 R2에 적용 할 이상하지 그리고 그것은 SQL 서버 2012에 도입 된 것으로,) 숫자 또는 날짜 / 시간 / 날짜 값이어야합니다.

그리고 아무것도 작동하지 않는 것 같습니다. 나는 두 번의 REPLACE전화 보다 더 우아한 것을 찾고 있었지만 지금까지 그런 행운은 없습니다.


또한 순수한 T-SQL 솔루션은 아니지만 SQLCLR을 통해이 작업을 수행 할 수도 있습니다. 그리고 String_TryParseToDecimal 이라는 SQL # 라이브러리 (필자가 쓴) 에이 작업을 수행하는 사전 완료 함수가 있습니다. 이 기능은 무료 버전에서 사용할 수 있으며 SQL Server 2005부터 모든 버전의 SQL Server에서 작동합니다.

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

보고:

7000.45000000000000000000

10

어떤 버전의 SQL Server를 사용하고 있습니까? SQL Server 2012부터는 TRY_PARSEUSING culture인수 와 함께 사용할 수 있습니다 . PARSE 를 사용할 수도 있습니다 PARSE. 변환에 실패하면 차이 가 발생 하고을TRY_PARSE 반환합니다 NULL.

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

시험 결과

HTH


1
방금 답변 맨 위에 메모를 추가하여 독자가 SQL Server 2012 이상을 사용하는 경우 여기에 지시합니다.
Solomon Rutzky

0

내 경우에는 다음 코드가 작동했습니다.

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

출력 : 123.456.789,03


또는 convert (varchar, FORMAT (cast (yourValue as numeric (10,2)), '###, ###, ###. 00', 'de-de'))를 선택하십시오.
Shahed Adnan

2
OP가 요청한 것과 반대의 문제에 답하고있는 것 같습니다. 숫자 값을 형식화하지 않고 형식화 된 varchar 값을 숫자로 변환하려고합니다.
ypercubeᵀᴹ

1
또한, 두 음 : 1) 항상을위한 길이 지정 VARCHAR, NVARCHAR, CHAR, 및 NCHAR유형. 경우에 따라 기본값은 30이고 다른 경우에는 1이며, 유지 관리 불가능하고 오류가 발생하기 쉬운 코드를 만듭니다. 2) 를 사용할 때 정확한 레이아웃이 필요하지 않습니다 #. #모든 자릿수 중 하나만 (예 :) 천 단위 구분 기호는 필요하지 않으며, 두 자릿수는 쉼표 (예 :)로 구분 #,#하여 모든 숫자 천 단위 구분 기호를 가져와야합니다. 따라서 SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));제안하는 것과 동일한 출력을 반환합니다.
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.