SQL Server에서 선행 0으로 패딩하여 숫자 서식 지정


119

SQL Server 2000에서 거의 10 년 동안 사용 된 오래된 SQL 테이블이 있습니다.

그것은, 우리의 직원 배지 번호로 저장됩니다 char(6)에서 000001999999.

지금 웹 애플리케이션을 작성 중이며 직원 배지 번호를 저장해야합니다.

나의 새로운 테이블에서 나는 지름길을 가지고 기존의 테이블을 복사하지만 단순히 저장하여, 등 더 나은 데이터 전송, 작은 크기,을 기대하고 수 int의 값을 1999999.

C #에서는 다음을 int사용하여 배지 번호 값의 형식을 빠르게 지정할 수 있습니다.

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

이 간단한 SQL 쿼리를 수정하여 반환 된 값의 형식도 지정하려면 어떻게해야합니까?

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

경우 EmployeeID7135이며,이 쿼리가 반환해야합니다 007135.


선행 0s는이 필드에서 중요 하므로 왜으로 변경 INT합니까?
Oded

2
SQL Server 2012는 마침내FORMAT C #과 같은 기능을 갖게 될 것입니다 :-)
marc_s

1
@Oden : int값은 훨씬 적은 공간을 char(6)차지하며 제조되는 부품 당 이러한 항목이 여러 개 있습니다. 능률.
jp2code

문제가 발생하기 전에 최적화하고 있습니까?
Oded

4
보자, 당신은 최대 백만 개의 배지 번호를 가지고 있고 DATALENGTH()각각 2 바이트 를 절약 할 수 있다고 생각합니다 . 열이 인덱스에있을 수 있으므로 2MB 이상을 절약 할 수 있습니다. 그리고 다른 열을 추가하면 해당 2 바이트는 행당 4KB 페이지를 저장할 수있을만큼 행 길이를 줄이는 데 충분할 수 있습니다. 모바일 플랫폼에서 호스팅됩니까, 아니면 비생산적인 영역에주의를 집중하고 있습니까?
HABO

답변:


172

숫자 6을 필요한 총 길이로 변경하십시오.

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId

열이 INT 인 경우 RTRIM을 사용하여 암시 적으로 VARCHAR로 변환 할 수 있습니다.

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)

그리고이 0을 제거하고 '실제'숫자를 반환하는 코드 :

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)

1
+1 0을 제거하는 방법도 보여 주셨습니다! 이것을 테스트하고 답으로 표시하겠습니다.
jp2code

0을 제거하기위한 코드가 필요하지 않고, 그냥 int로 할당하거나 변환하면 자동으로 제거됩니다.
Jimbo

2
이것은 전달 된 값이 문자열 인 경우에만 작동하고 정수를 전달하면 전달한 것과 동일한 값을 얻습니다.
Mordy

2
오래되었지만 ... "+ EmployeeID"대신 "+ convert (varchar, EmployeeID)"를 사용하면 int 문제를 해결할 수 있습니다
Krishna Sarma 2014 년

3
EmployeeId가 NULL 결과를 유발하는 6 자리보다 크지 않는 한 좋은 방법입니다. 연락처 함수가 답입니다. SELECT CONCAT (REPLICATE ( '0', 6-LEN (CONVERT (varchar, EmployeeId))), EmployeeId)
Mahmoud Moravej

125

FORMAT 함수를 사용하십시오 (SQL Server 2012 이상에서 작동).

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 

참조 : http://msdn.microsoft.com/en-us/library/hh213505.aspx


1
이것은 SQL Server 2012가 나오기 전의 오래된 질문입니다.
jp2code

19
그래도 이제이 거품이 정상에 좀 더 가까워 졌으면합니다.
Dave Haynes

4
누군가 궁금해하는 경우를 대비하여. Format데이터 유형을 보존하지 않지만 암시 적으로 nvarchar로 변환합니다.select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Ralph

2
이 방법이 가장 간단하고 IMHO가 최상의 솔루션입니다.
로버트 Lujo

대규모 데이터 세트에 사용하는 경우이 기능
amd

33

이 방법으로 절차를 변경할 수 있습니다.

SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, 
       EmployeeID
FROM dbo.RequestItems 
WHERE ID=0 

그러나 이것은 당신 EmployeeID이 숫자 값 이라고 가정 하고이 코드는 결과를 문자열로 변경하므로 원래 숫자 값을 다시 추가하는 것이 좋습니다

편집 물론 위의 질문을주의 깊게 읽지 않았습니다. 필드가 char(6)이므로 EmployeeID가 숫자 값이 아니라고 말합니다 . 이 답변은 여전히 ​​그 자체로 가치가 있지만 위의 질문에 대한 정답은 아닙니다.


이것이 내가 생각하기에 가장 깨끗한 방법입니다. 감사합니다
iheartcsharp

'000000'정말 필요한 가요 ..? '0'또한 잘 작동합니다. 0 .. 하나만 사용해도 안전합니까?
shashwat

1
OP는 결과로 6 자 길이의 문자열을 요청했습니다. 특히 EmployeeID가 7135 인 경우이 쿼리는 007135를 반환해야합니다 . 하나의 '0'만 사용하면 07135not을 반환합니다 007135. 전체 아이디어는 0EmployeedID로 변환 된 모든 문자열로 구성된 6 자 문자열에 연결 한 다음 오른쪽 가장자리에서 시작 하여 6자를 사용하는 것입니다. ID의 길이가 무엇이든 위의 메서드는 항상 6 자 길이에 도달하는 데 필요한 0 자 수만있는 문자열을 반환합니다
Steve

에 적어도 하나의 숫자가 포함 '00000'되므로 5 개의 0이 될 수 있습니다 EmployeeID. 그러나이 REPLICATE()기능은 다른 답변처럼, 더 맞는 것 같다
nosklo

26

int를 변환하는 것을 싫어했고 이것은 훨씬 더 간단 해 보입니다. 단 하나의 문자열 변환과 간단한 추가가 있기 때문에 더 나은 성능을 발휘할 수 있습니다.

선택 RIGHT (1000000 + 직원 ID 6) ...

"1000000"에 필요한 크기만큼 0이 있는지 확인하십시오.


11

나는 모든 것을 한곳에 게시하고 있으며, 모두 4 선행 0으로 채울 수 있습니다. :)

declare @number int =  1;
print right('0000' + cast(@number as varchar(4)) , 4)
print right('0000' + convert(varchar(4), @number) , 4)
print right(replicate('0',4) + convert(varchar(4), @number) , 4)
print  cast(replace(str(@number,4),' ','0')as char(4))
print format(@number,'0000')

여기에는 필요한 모든 옵션이 포함됩니다. 감사합니다.
kyurthich

6

완전성을위한 또 다른 방법입니다.

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)

또는 귀하의 쿼리에 따라

SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) 
         AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0

@ jp2code - 당신은 필요 에 StackOverflow가 무엇인지에 읽을 의 협력 위키처럼 편집 - - 그것의하지 당신의 질문을 빨리 당신이 그것을 게시 한로! 일반적으로 편집되는 것은 사전에 감사를 표하고 문법 / 대문자가 부족한 것과 같은 과도한 "보풀"입니다.
Jamiec 2013

5

2012 버전부터 다음을 사용할 수 있습니다.

SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0

4

변수로 대체 할 수있는 범위를 얻고 제공 할 수있는만큼 깔끔합니다.

Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0

상기 중간 EmployeeID열로서 정의된다 int후 + 연산자는 또한 대신으로 연결하고 제로가 손실 될 수 있도록 처리한다. 사용 convert하면이 문제를 피할 수 있습니다.

'000000'을 피하기 입력에 복제를 ( '0', 6)를 호출하면 ;-) 단지 낭비
믈라덴 미하일로비치

3
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0

2
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0

이런. 사실 이것은 7135.0내가 그것을 줄 때 나에게 주었다 7135.
jp2code

1

이 솔루션은 모든 SQL 버전에 대해 선행 0이있는 부호 / 음수에 대해 작동합니다.

DECLARE
    @n money = -3,
    @length tinyint = 15,
    @decimals tinyint = 0

SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')

1

가장 간단한 것이 항상 최고입니다.

Select EmployeeID*1 as EmployeeID 

-1

내 버전의 SQL에서는 REPLICATE를 사용할 수 없습니다. 그래서 나는 이것을했다.

SELECT 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.