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