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시>는 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')
하면 .'***'
< 0 n , 은 Out-Out-Off-Input 의 의 한 표시기입니다.n < 0 는 n 999 。여기에 기재되어 있는 다른 메서드는 3글자 서브스트링에 대한 입력을 잘라내면 자동으로 실패합니다.
다음은 SQL Server Express 2012에서 사용하는 Hogan의 답변의 변형입니다.
SELECT RIGHT(CONCAT('000', field), 3)
쓰지 '나'만 하면 요.CONCAT
가 ""일 수 있는 "NULL
를 사용합니다.ISNULL
는, 의 취득을 하게 되는 경우가 있습니다.NULL
★★★★★★ 。
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 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 = COALESCE(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()
에서는, 「Calls 」를 할 필요가 있습니다.[n]varchar
변환된 결과를 잘라서 보관하기에 충분한 길이입니다.
저는 항상 다음과 같은 방법이 도움이 된다고 생각합니다.
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)
이것을 일정한 길이로 사용해 보세요.
select right('000000'+'123',5)
select REPLICATE('0', 5 - LEN(123)) + '123'
이게 오래된 티켓인 건 알지만 이걸 공유하려고요.
나는 해결책을 제공하는 이 코드를 찾았다.모든 버전의 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가 있고 올바른 양의 제로가 추가됩니다.증감할 수 있습니다.23번 도로에서는 길이를 알 필요가 없습니다.
편집: @Anon의 투고와 같은 것을 알 수 있습니다.
정수의 경우 int에서 varchar로 암묵적인 변환을 사용할 수 있습니다.
SELECT RIGHT(1000 + field, 3)
고정 크기의 varchar(또는 문자열) 출력이 필요할 때 입력과 같은 정수열에 문제가 있었습니다.예를 들어 1에서 '01', 12에서 '12'입니다.이 코드는 동작합니다.
SELECT RIGHT(CONCAT('00',field::text),2)
입력도 바르샤르의 열이면 주조 부품을 피할 수 있습니다.
좀 더 역동적인 접근을 위해 이것을 사용해 보세요.
declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)
마지막으로 이것을 사용하기로 결정했습니다.
RIGHT(STUFF(ReceiptNum, 1, 0, replicate('0',10)),10)
특정 길이(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 입력 반환
간단히 말하면
예를 들어 다음과 같습니다.
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
SQL Server 2008에서 표준 시간대 오프셋을 표준 시간대 문자열로 변환하여 날짜를 DATETIMEOFSET으로 변환하는 방법을 알아보려고 왔습니다.징그럽지만 필요하죠
그래서 음수와 양수에 대응할 수 있는 한 가지 방법이 필요합니다.필요에 따라 두 글자의 선두에 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,' ')
언급URL : https://stackoverflow.com/questions/16760900/pad-a-string-with-leading-zeros-so-its-3-characters-long-in-sql-server-2008
'programing' 카테고리의 다른 글
PowerShell 콘솔에 쓰는 방법 (0) | 2023.04.08 |
---|---|
PowerShell - 시작 프로세스 및 cmdline 스위치 (0) | 2023.04.08 |
PowerShell 스크립트에 인수를 전달하려면 어떻게 해야 합니까? (0) | 2023.04.08 |
Windows 배치 파일에서 콘솔에 빈(빈) 행을 에코합니다. (0) | 2023.04.08 |
윤곽 반지름? (0) | 2023.04.08 |