선행 0을 사용하여 int를 char로 변환하는 방법은 무엇입니까?


98

int 데이터 필드를 선행 0으로 nvarchar로 변환해야합니다.

예:

1 '001'로 변환

867은 '000867'등으로 변환합니다.

고마워.


4 시간 후의 답변입니다 ...

이 T-SQL 스크립트를 테스트하고 잘 작동합니다!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

이 사용자 함수를 만들었습니다.

T-SQL 코드 :

CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
AS
BEGIN

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

    RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal)))) 
        + CONVERT(nvarchar(20),@intVal)

END

예 :

dbo.CIntToChar (867, 6)를 COD_ID로 선택

산출

000867


1
첫 번째 샘플에서 CAST는 NCHAR 유형 대신 NVARCHAR이어야합니다. NCHAR (3)의 길이는 항상 3이기 때문입니다.
nzeemin

답변:


100

이 시도: select right('00000' + cast(Your_Field as varchar(5)), 5)

결과는 5 자리 숫자로 표시됩니다. 예 : 00001, ...., 01234


1
포스트 그레스 위해 당신이 그렇게, ||로 +를 대체해야합니다select right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

57

SQL Server 2012에 도입 된 FORMAT () 함수를 사용할 수도 있습니다 . http://technet.microsoft.com/library/hh213505.aspx

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')

나는 SQL2012에 동의하지만, 그 SQL 2008R2 세 이상, 내 솔루션은 결과를 얻을 것이다
GoldBishop

1
방금 FORMAT Sql Server 2012를 테스트했습니다. "몇 초에 하나의 숫자"처럼 느립니다. 떨어져.
Muposat 2015

@Muposat, 해당 테스트에 대한 코드를 제공 할 수 있습니까? 매우 중요합니다. 미리 감사드립니다.
Diomedes Domínguez

3
@Diomedes Domínguez는 1 년이 지났으므로 더 이상 원래 테스트가 없습니다. 정말 빠른 서버에서 또 다른 테스트를 실행하고 1 백만 개의 숫자를 포맷하는 데 32 초가 걸렸습니다. 세상의 끝은 아니지만 Nguyen Tran이 게시 한 솔루션은 1 초 만에이를 수행합니다. 테스트하려면 단순히 @i int = 0에서 10000000까지 루프를 만듭니다.
Muposat

22

사용 REPLICATE하면 모든 선행 0을 하드 코딩 할 필요가 없습니다.

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

산출:

0000000123

13

이 질문을 High-Jack하는 것은 아니지만 (N) CHAR 데이터 유형 대신 (N) VARCHAR을 사용해야한다는 메모를 작성해야합니다.

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

위 세그먼트는 SQL 2005에서 올바른 응답을 생성하지 않습니다.

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

위 세그먼트는 SQL 2005에서 원하는 응답을 생성합니다.

varchar는 원하는 접두사 길이를 즉시 제공합니다. 고정 길이 데이터 유형에 길이 지정 및 조정이 필요한 경우.


6

나는 사용하고 싶다

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

이것은 나에게 준다

000000004

1
약간 엉망인 것 같지만 DB2에서 저에게 효과적이었습니다. 위의 답변을 작동하지 못했습니다.
Nathan M.

2
나도 좋아해. 길이가 하드 코딩되어있는 경우, 당신은 사용할 수 있습니다 RIGHT(1000+Number, 3)- 좋은 짧고 빠른
MAF 소프트

1
이것은 2005 년 이후의 모든 SQL Server 변형에서 작동합니다. 선호하는 대답.
Fandango68

1
10은 무엇을 의미합니까?
Fandango68

1
@ Fandango68 위의 'POWER (10, @Length)'의 '10'은 10 진법 산술을 사용하기 때문입니다. 따라서 위의 maf-soft 답변의 '1000'리터럴은 POWER (10, 3)-10 ^ 3과 같습니다. = 1000.
qxotk

4

데이터 유형 "int"는 10 자리를 초과 할 수 없습니다. 추가로 "Len ()"함수는 int에서 작동하므로 len () 함수를 호출하기 전에 int를 문자열로 변환 할 필요가 없습니다.

마지막으로, int의 크기> 패딩하려는 총 자릿수 (@intLen) 인 경우를 고려하지 않습니다.

따라서보다 간결하고 정확한 솔루션은 다음과 같습니다.

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END

3

별로 우아하지는 않지만 변환하려는 숫자에 원하는 수의 선행 0으로 설정 값을 추가하고 RIGHT 함수를 사용합니다.

예:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

결과 : '000867'


2

SQL Server 2008 이상을위한 한 줄 솔루션 ( 그 자체 ) :

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

SIGN식에 의한 곱셈 은 MAX(0, @DesiredLenght-LEN([Column])). 문제는 MAX()단 하나의 주장 만 받아 들인다 는 것입니다 ...


1

여기서 좋은 기사를 찾았 습니다 .

선행 0으로 문자열 채우기

고정 길이 데이터 내보내기를 출력 할 때이 작업을 여러 번 수행해야합니다. 예를 들어 숫자 열의 길이는 9 자이고 선행 0을 접두사로해야합니다.


1
    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

BTW 그것이 int 열이면 여전히 0을 유지하지 않습니다. 프레젠테이션 레이어에서 수행하거나 SELECT에서 실제로 필요한 경우


1

같은 문제가 있었는데, 이것이 제가 해결 한 방법입니다. 단순하고 우아합니다. "4"는 정수의 길이에 관계없이 문자열이 얼마나 길어야하는지에 관계없이 0이 "4"까지 채워집니다.

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

1

제 경우에는 10 자 필드 (NVARCHAR (10))에서 필드 앞에 0이 있기를 원했습니다. 소스 파일에는 다른 테이블에서 조인하는 데 필요한 선행 0이 없습니다. 이것은 단순히 SQL Server 2008R2에 있기 때문입니다.

Set Field = right (( '0000000000'+ [Field]), 10) (SQL2012 이전이므로 Format ()을 사용할 수 없음)

기존 데이터에 대해이를 수행했습니다. 따라서 1 또는 987654321은 여전히 ​​10 개의 공백을 선행 0으로 채 웁니다.

새 데이터를 가져 와서 Access 데이터베이스를 통해 테이블로 덤프하므로 Access에서 SQL 서버 테이블에 새 레코드를 추가 할 때 Format ([Field], "0000000000")을 사용할 수 있습니다.


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- 'RTRIM'이 없으면 반환되는 값은 3__!!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

- 'RTRIM'이 없으면 반환되는 값은 867___!!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

0

사용 RIGHT은 좋은 옵션이지만 다음을 수행 할 수도 있습니다.

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

N표시하려는 총 자릿수는 어디에 있습니까 ? 따라서 선행 0 ( N = 3)이 있는 3 자리 값의 경우 :

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

또는 교대로

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

이것이하는 일은 충분한 선행 0을 생성하기에 충분한 10의 거듭 제곱에 원하는 값을 더한 다음 선행 1을 잘라내는 것입니다.

이 기술의 장점은 결과가 항상 사용 가능, 같은 길이 될 것입니다 SUBSTRING대신 RIGHT(HQL 같은) 일부 쿼리 언어에서 사용할 수 없습니다.


0

이것은 MYSQL에서 나를 위해 일합니다.

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

예를 들면 :

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

이것이 도움이되기를 바랍니다. 친애하는


0

SQLServer에서 작동

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

즐겨


-2

이게 당신에게 유용할까요?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.