programing

SQL Server 2008에서 문자열에 선행 0을 패딩하여 3자 길이 설정

powerit 2023. 4. 8. 09:52
반응형

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시>는 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')

하면 .'***'< 0 n , 은 Out-Out-Off-Input 의 의 한 표시기입니다.n < 0 는 n 999 。여기에 기재되어 있는 다른 메서드는 3글자 서브스트링에 대한 입력을 잘라내면 자동으로 실패합니다.

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

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

쓰지 '나'만 하면 요.CONCAT가 "" 수 있는 "NULL 를 사용합니다.ISNULL는, 의 취득을 하게 되는 경우가 있습니다.NULL★★★★★★ 。

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 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 = COALESCE(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() 에서는, 「Calls 」를 할 필요가 있습니다.[n]varchar변환된 결과를 잘라서 보관하기에 충분한 길이입니다.

저는 항상 다음과 같은 방법이 도움이 된다고 생각합니다.

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)

이것을 일정한 길이로 사용해 보세요.

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

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

이게 오래된 티켓인 건 알지만 이걸 공유하려고요.

나는 해결책을 제공하는 이 코드를 찾았다.모든 버전의 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가 있고 올바른 양의 제로가 추가됩니다.증감할 수 있습니다.23번 도로에서는 길이를 알 필요가 없습니다.

편집: @Anon의 투고와 같은 것을 알 수 있습니다.

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

SELECT RIGHT(1000 + field, 3)

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

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

입력도 바르샤르의 열이면 주조 부품을 피할 수 있습니다.

좀 더 역동적인 접근을 위해 이것을 사용해 보세요.

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

마지막으로 이것을 사용하기로 결정했습니다.

RIGHT(STUFF(ReceiptNum, 1, 0, replicate('0',10)),10)

특정 길이(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 입력 반환

간단히 말하면

예를 들어 다음과 같습니다.

DECLARE @DUENO BIGINT
SET @DUENO=5

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

SQL Server 2008에서 표준 시간대 오프셋을 표준 시간대 문자열로 변환하여 날짜를 DATETIMEOFSET으로 변환하는 방법을 알아보려고 왔습니다.징그럽지만 필요하죠

그래서 음수와 양수에 대응할 수 있는 한 가지 방법이 필요합니다.필요에 따라 두 글자의 선두에 0이 붙습니다.Anons의 답변으로 인해 나는 가까워졌지만, 부정적인 시간대 값은 다음과 같이 나올 것이다.0-5한 '''가 '''입니다.-05

그래서 그의 답변에 약간의 수정을 가하면, 이것은 모든 시간대 시간 변환에 사용할 수 있습니다.

DECLARE @n INT = 13 -- Works with -13, -5, 0, 5, etc
SELECT CASE 
    WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0') 
    ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'

bigint와 선행 0 또는 기타 단일 문자(반환되는 최대 20자)를 지원하며 입력 번호의 길이보다 작은 결과 길이를 허용하는 이 함수를 만들었습니다.

create FUNCTION fnPadNum (
  @Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Pads bigint with leading 0's
            --Sample:  "select dbo.fnPadNum(201,5,'0')" returns "00201"
            --Sample:  "select dbo.fnPadNum(201,5,'*')" returns "**201"
            --Sample:  "select dbo.fnPadNum(201,5,' ')" returns "  201"
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Usage:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')

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

반응형