T-SQL의 PadLeft 함수


113

다음 표 A가 있습니다.

id
----
1
2
12
123
1234

id0으로 값 을 왼쪽 채울 필요가 있습니다 .

id
----
0001
0002
0012
0123
1234

이것을 어떻게 할 수 있습니까?

답변:


197

나는 이것이 당신이 찾고있는 것일 수 있다고 믿습니다.

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

또는

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

두 번째 예제에서 구문을 테스트하지 않았습니다. 100 % 작동하는지 확실하지 않습니다. 약간의 조정이 필요할 수 있습니다.하지만 원하는 출력을 얻는 방법에 대한 일반적인 아이디어를 전달합니다.

편집하다

의견에 나열된 문제를 해결하려면 ...

@ pkr298-예 STR은 숫자에서만 작동합니다 ... OP의 필드는 ID입니다 ... 따라서 숫자로만.

@Desolator-물론 작동하지 않습니다 ... 첫 번째 매개 변수의 길이는 6 자입니다. 다음과 같이 할 수 있습니다.

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

이것은 이론적으로 골 포스트를 움직여야합니다 ... 숫자가 커질수록 항상 작동해야합니다 .... 1 또는 123456789 ...

따라서 최대 값이 123456이면 0000123456이 표시되고 최소값이 1이면 0000000001이 표시됩니다.


4
STR ()은 숫자 (또는 문자열 필드의 숫자)에서만 작동합니다. 이 코드는 숫자가 있다고 가정하지만 레코드 중 하나에 잘못된 (숫자가 아닌) 데이터가있는 varchar 필드에서 사용하는 경우 중단됩니다. 이 경우 RIGHT () 함수는 중단되지 않습니다.
pkr298

1
수가 큰 길이 인 경우 STR () 함수는 작동하지 않습니다 (예 : STR(123456, 4)리턴****

2
@Desolator 추가 한 시나리오를 용이하게하기 위해 응답 및 수정 사항을 추가했습니다.
Patrick

67

SQL Server는 이제 2012 버전부터 FORMAT 함수를 지원 하므로 다음과 같이됩니다.

SELECT FORMAT(id, '0000') FROM TableA

트릭을 할 것입니다.

ID 또는 열이 a에 varchar있고 먼저 변환 한 숫자를 나타내는 경우 :

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA

매끄럽고 간단합니다. 감사합니다! ) 원래의 질문의 일을 감안할 때,이 이제 공식적인 답변해야한다
데이비드 더슨

1
id가 문자열이면 먼저 정수로 변환 할 수 있습니다.-select format (convert (int, id), '0000')
CrimsonKing

미안하지만이 방법은 정말 느리기 때문에 반대표를 던집니다. 90 행 이상을 실행하는 데 4 초가 걸렸지 만 수락 된 답변은 즉각적이었습니다. 이것은 매우 큰 단점이며 FORMAT은 최대 하나 또는 두 개의 레코드에만 사용해야합니다. 그렇지 않으면 성능이 매우 나빠서 쓸모가 없습니다.
그림자 마법사 귀는 당신을위한

@ShadowWizard 1000 행의 FORMAT을 사용하여 즉각적인 성능을보고 있습니다.
JohnnyHK

@JohnnyHK는 아마도 테이블 디자인이나 다른 db 기이 한 무언가가있을 수 있지만 여전히 ... 사실은 저에게 정말 느 렸고 다른 방법은 빠르다는 것입니다.
그림자 마법사가 당신을 위해 귀입니다


43

이전 게시물이지만 아마도 이것은 누군가를 도울 수 있습니다.

공백이 아닌 4 개의 문자로 끝날 때까지 완료하려면 :

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

10 시까 지 완료하려면 :

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

열이 numeric 인 경우 먼저 다음 코드를 사용하여 varchar로 변환하십시오.

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

숫자 필드로 10까지 완료하려면 :

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;

1
@ SilverM-A, 숫자 앞에 0을 추가하는 유틸리티가 없습니다. 어쨌든 무시 될 것이기 때문입니다 (0003은 결국 3입니다). 아마도 당신이 원하는 것은 그 숫자를 문자열 (varchar)로 캐스트 한 다음 위의 명령문을 사용하는 것입니다.
Marcelo Myara 2015

1
@ SilverM-A, 그렇다면 다음과 같이 "CAST"명령을 사용하여 캐스트하십시오. SELECT RIGHT ( '0000000000'+ CAST (COLUMNNAME AS VARCHAR), 10) FROM TABLENAME; 그게 다야?
Marcelo Myara 2015

@MarceloMyara 이것은 단지 댓글이 아닌 답변의 일부 여야합니다. 지금 직접 추가했습니다.
그림자 마법사 귀는 당신을위한

참고 : 이것은 정말 느려질 수있는 멋진 기능이없는 가장 효율적인 대답입니다. 따라서 나는 그것에 추가 현상금을 주었다.
그림자 마법사가 당신을 위해 귀입니다

12

이 시도:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]


5

이것은 문자열, 정수 및 숫자에 대해 작동합니다.

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

어디 4길이를 바람직하다. 4 자리 이상의 숫자에 대해 작동하며 NULL값에 빈 문자열을 반환 합니다.


3

누군가가 여전히 관심이 있다면 DATABASE.GUIDE : Left Padding in SQL Server – 3 LPAD () Equivalents 에서이 기사를 찾았습니다.

요컨대, 그 기사에서 언급 된 세 가지 방법이 있습니다.
id = 12라고 가정하고 0012로 표시해야합니다.

방법 1 – RIGHT () 함수
사용 첫 번째 방법은 선행 0을 추가 한 후 RIGHT () 함수를 사용하여 문자열의 맨 오른쪽 부분 만 반환합니다.

SELECT RIGHT('00' + '12', 4);

결과:
0012

방법 2 – RIGHT () 및 REPLICATE () 조합 사용
이 방법은 이전 방법과 거의 동일하지만 세 개의 0을 REPLICATE () 함수로 간단히 바꾼다는 점만 다릅니다.

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

결과:
0012

방법 3 – REPLACE () 및 STR () 조합 사용
이 방법은 이전 방법과 완전히 다른 각도에서 비롯됩니다.

SELECT REPLACE(STR('12', 4),' ','0');

결과:
0012

기사를 확인하십시오. 예제와 함께 더 자세한 분석이 있습니다.


2

이것은 내가 값을 채워야 할 때 일반적으로 사용하는 것입니다.

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)

1

SQL 서버의 함수에 이것을 필요로하고 Patrick의 대답을 약간 조정했습니다.

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

1

기능 생성 :

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

예:

Select dbo.PadLeft('123456','0',8)

표준에 대한 요점은 IsNull 검사를 신경 쓰지 않을 것입니다. 값이 null 인 경우 함수는 기본 제공 함수의 표준 동작이므로 해당 값에 대해 여전히 null을 반환해야합니다. 모든 것을 null이 아닌 값으로 변환하면 호출자는 더 이상 예상 할 수있는 null 논리 연산을 사용할 수 없습니다. (널 내 테이블 수단의 다양한에서 '지정되지 않은'및 디폴트 값이 사용되어야한다.SELECT @var = LTRIM(RTRIM(@Text))
크리스 쉘러에게

1

함수를 만들었습니다.

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

사용 : select dbo.fnPadLeft (123, 10)

반환 : 0000000123


0

필요한 경우 ODBC를 준수하는 것은 다음과 같습니다.

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

이것은 10 진법 숫자의 자릿수가 로그의 정수 구성 요소로 찾을 수 있다는 사실에 근거합니다. 여기에서 원하는 패딩 너비에서 뺄 수 있습니다. 반복은 null1 미만의 값 을 반환 하므로 ifnull.


0

내 솔루션은 효율적이지 않지만 일부 항목에 영숫자 값이있는 varchar로 값 (은행 수표 번호 및 전신 송금 참조 번호)이 저장되고 길이가 6 자 미만인 경우 패딩해야하는 상황에서 도움이되었습니다.

누군가가 같은 상황을 만나면 공유 할 생각

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789

0

간단한 예는 다음과 같습니다.

    DECLARE @number INTEGER
    DECLARE @length INTEGER
    DECLARE @char   NVARCHAR(10)
    SET @number = 1
    SET @length = 5
    SET @char = '0'

    SELECT FORMAT(@number, replicate(@char, @length))

0

원하는 출력 문자 길이를 지정할 수있는 함수를 만들었습니다.

CREATE FUNCTION [dbo].[udfLeadingZero]
(
        @String VARCHAR(MAX)
,       @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
    SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO

예제 결과


-5

더 효율적인 방법은 다음과 같습니다.

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234

6
0으로 채우기에 대한 OP 질문에 어떻게 대답합니까?
Filburt 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.