[sql-server] SQL Server 2008에서 앞에 오는 0으로 문자열을 채우면 길이는 3 자입니다.

SQL Server 2008 R2에서 처음 만들 때 최대 3 자 길이의 문자열이 있습니다.

선행 0으로 채우고 싶습니다. 원래 값이 ‘1’이면 새 값은 ‘001’입니다. 또는 원래 값이 ’23’인 경우 새 값은 ‘023’입니다. 또는 원래 값이 ‘124’이면 새 값은 원래 값과 같습니다.

SQL Server 2008 R2를 사용하고 있습니다. T-SQL을 사용하여이 작업을 어떻게 수행합니까?



답변

필드가 이미 문자열 인 경우 작동합니다

 SELECT RIGHT('000'+ISNULL(field,''),3)

null을 ‘000’으로 표시하려면

정수 일 수 있습니다-원하는 경우

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

질문에 필요한 것처럼이 대답은 길이 <= 3 인 경우에만 작동합니다. 더 큰 것을 원하면 문자열 상수와 두 정수 상수를 필요한 너비로 변경해야합니다. 예 :'0000' and VARCHAR(4)),4


답변

질문은 SQL Server 2008 R2에 대한 것이지만 누군가 누군가 2012 이상 버전으로 이것을 읽는 경우 FORMAT을 사용하면 훨씬 쉬워졌습니다 .

표준 숫자 형식 문자열 또는 사용자 지정 숫자 형식 문자열 을 형식 인수로 전달할 수 있습니다 ( 이 힌트에 대해 Vadim Ovchinnikov 에게 감사드립니다 ).

이 질문에 대해 예를 들어

DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

출력

001
001


답변

안전한 방법 :

SELECT REPLACE(STR(n,3),' ','0')

이것은 '***'n <0 또는 n> 999에 대한 문자열 을 반환하는 이점이 있는데 , 이는 범위를 벗어난 입력을 나타내는 훌륭한 지표입니다. 여기에 나열된 다른 방법은 입력을 3 문자 하위 문자열로 자르면 자동으로 실패합니다.


답변

다음은 원하는 너비로 왼쪽 패딩을위한보다 일반적인 기술입니다.

declare @x     int     = 123 -- value to be padded
declare @width int     = 25  -- desired width
declare @pad   char(1) = '0' -- pad character

select right_justified = replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           )
                       + convert(varchar(100),@x)

그러나 음수 값을 처리하고 선행 0을 채우면이 방법이나 다른 제안 된 기술이 작동하지 않습니다. 다음과 같은 것을 얻을 수 있습니다.

00-123

[아마도 당신이 원하지 않는 것]

따라서… 몇 가지 추가 후프를 뛰어 넘어야합니다. 음수의 형식을 올바르게 지정하는 한 가지 방법이 있습니다.

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- source string (converted from numeric value)
         case when @x < 0 then 2 else 1 end ,                 -- insert position
         0 ,                                                  -- count of characters to remove from source string
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
         )

하나는주의해야 convert()통화가 지정해야 [n]varchar절단으로 변환 된 결과를 저장하기에 충분한 길이를.


답변

다음은 SQL Server Express 2012에서 사용하는 Hogan의 답변 변형입니다.

SELECT RIGHT(CONCAT('000', field), 3)

필드가 문자열인지 아닌지 걱정하는 대신 CONCAT어쨌든 문자열을 출력하기 때문에 필드 입니다. 분야가 될 수 또한 경우에 NULL사용하는 ISNULL기능을 입지 않도록해야 할 수 있습니다 NULL결과를.

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)


답변

나는 항상 다음 방법이 매우 유용하다는 것을 알았습니다.

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'


답변

모든 상황에 적합한이 기능을 사용하십시오.

CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @NumStr VARCHAR(250)

    SET @NumStr = LTRIM(@input)

    IF(@pad > LEN(@NumStr))
        SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;

    RETURN @NumStr;
END

샘플 출력

SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016