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 인 경우에만 작동합니다. 더 큰 것을 원하면 문자열 상수와 두 정수 상수를 필요한 너비로 변경해야합니다. 예 :
'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
기존 데이터를 업데이트하려는 경우 다음 쿼리가 있습니다.
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
정수의 경우 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 입력을 반환
고정 크기의 varchar (또는 문자열) 출력이 필요할 때 입력과 정수 열에 비슷한 문제가있었습니다. 예를 들어 1 ~ '01', 12 ~ '12'입니다. 이 코드는 작동합니다 :
SELECT RIGHT(CONCAT('00',field::text),2)
입력이 varchar의 열인 경우 주조 부품을 피할 수 있습니다.
간단합니다
처럼:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
보다 역동적 인 접근 방식을 시도해보십시오.
declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)
고정 길이로 시도하십시오.
select right('000000'+'123',5)
select REPLICATE('0', 5 - LEN(123)) + '123'
'Programing' 카테고리의 다른 글
날짜에 대해 Math.Min 및 Math.Max에 해당합니까? (0) | 2020.03.02 |
---|---|
목록의 모든 요소가 동일한 지 확인하십시오 (0) | 2020.03.02 |
터미널에서 MySQL로 데이터베이스를 가져 오려면 어떻게해야합니까? (0) | 2020.03.02 |
파이썬 : 예외를 무시하고 진행하는 방법? (0) | 2020.03.02 |
Cygwin을 사용하여 C : \의 디렉토리로 이동하는 방법은 무엇입니까? (0) | 2020.03.02 |