SQL Server 2008 R2에서 처음 만들 때 최대 3 자 길이의 문자열이 있습니다.
선행 0으로 채우고 싶습니다. 원래 값이 '1'이면 새 값은 '001'입니다. 또는 원래 값이 '23'인 경우 새 값은 '023'입니다. 또는 원래 값이 '124'이면 새 값은 원래 값과 같습니다.
SQL Server 2008 R2를 사용하고 있습니다. T-SQL을 사용하여이 작업을 어떻게 수행합니까?
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 문자 하위 문자열로 자르면 자동으로 실패합니다.
SELECT REPLACE(STR('1',3),' ','0')
나누기 : SELECT REPLACE(STR('1A',3),' ','0')
. 사용자가 입력 문자열에 문자를 입력했을 때 오늘 화상을 입었고 그 경우를 테스트하지 못했습니다.
다음은 원하는 너비로 왼쪽 패딩을위한보다 일반적인 기술입니다.
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)
모든 상황에 적합한이 기능을 사용하십시오.
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
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;
위와 같은 Salar의 첫 번째 예제를 반환합니다. 감사합니다 Salar.
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;
반환 0000002016
됩니다.
정수의 경우 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 입력을 반환
SQL Server 2008에서 날짜를 DATETIMEOFFSET로 변환하기 위해 시간대 오프셋을 표준 시간대 문자열로 변환하는 방법을 알아 내기 위해 여기에 왔습니다.
따라서 음수와 양수에 대처하는 1 가지 방법이 필요합니다. 필요한 경우 앞에 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,' ')