Programing

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

lottogame 2020. 3. 2. 12:59
반응형

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 

기존 데이터를 업데이트하려는 경우 다음 쿼리가 있습니다.

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)

정수의 경우 int에서 varchar로 암시 적 변환을 사용할 수 있습니다.

SELECT RIGHT(1000 + field, 3)

나는 그것을 공유하려고 생각했던 오래된 티켓을 알고 있습니다.

이 코드에서 해결책을 찾고 있습니다. 모든 버전의 MSSQL에서 작동하는지 확실하지 않은 경우 MSSQL 2016이 있습니다.

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

"0023"을 리턴합니다. STR 함수의 4는 값을 포함한 전체 길이입니다. 예제 4, 23 및 123은 모두 STR에 4를 가지며 올바른 양의 0이 추가됩니다. 늘리거나 줄일 수 있습니다. 23의 길이를 얻을 필요가 없습니다.

편집 : 나는 @Anon post와 동일하게 보입니다.


특정 길이 (9)까지의 요구 사항이 있었기 때문에 이것을 썼습니다. 입력에 패딩이 필요한 경우에만 @pattern으로 왼쪽을 채 웁니다. 항상 @pattern에 정의 된 길이를 반환해야합니다.

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

1234 입력을 반환


고정 크기의 varchar (또는 문자열) 출력이 필요할 때 입력과 정수 열에 비슷한 문제가있었습니다. 예를 들어 1 ~ '01', 12 ~ '12'입니다. 이 코드는 작동합니다 :

SELECT RIGHT(CONCAT('00',field::text),2)

입력이 varchar의 열인 경우 주조 부품을 피할 수 있습니다.


간단합니다

처럼:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO

보다 역동적 인 접근 방식을 시도해보십시오.

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)

고정 길이로 시도하십시오.

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

참고 URL : https://stackoverflow.com/questions/16760900/pad-a-string-with-leading-zeros-so-its-3-characters-long-in-sql-server-2008



반응형