[SQL] 대부분의 효율적인 T-SQL 패드 방식으로 일정한 길이로 왼쪽에 VARCHAR?
SQL대부분의 효율적인 T-SQL 패드 방식으로 일정한 길이로 왼쪽에 VARCHAR?
비교 대답 :
REPLICATE(@padchar, @len - LEN(@str)) + @str
해결법
-
==============================
1.이것은 단순히 SQL, 당신이 그것을 할 아무리의 비효율적 인 사용이다.
이것은 단순히 SQL, 당신이 그것을 할 아무리의 비효율적 인 사용이다.
같은 아마 뭔가
right('XXXXXXXXXXXX'+ rtrim(@str), @n)
X는 패딩 문자가와 결과 문자열의 문자 수는 @n이다 (당신이 고정 된 길이를 처리하기 때문에 당신이 패딩을 필요로 가정).
하지만 당신이 정말로 데이터베이스에이 일을하지 않도록해야한다고 말했다한다.
-
==============================
2.나는이 원래 다시 2008 년에 질문을 받았다 알고 있지만, SQL 서버 2012 잘 제로 왼쪽 포맷 기능을 단순화 패딩 소개 된 몇 가지 새로운 기능이 있습니다. 그것은 또한 당신을위한 변환을 수행합니다 :
나는이 원래 다시 2008 년에 질문을 받았다 알고 있지만, SQL 서버 2012 잘 제로 왼쪽 포맷 기능을 단순화 패딩 소개 된 몇 가지 새로운 기능이 있습니다. 그것은 또한 당신을위한 변환을 수행합니다 :
declare @n as int = 2 select FORMAT(@n, 'd10') as padWithZeros
최신 정보:
나는 FORMAT 기능을 자신의 실제 효율성을 테스트하고 싶었다. 나는 아주 아주 좋은 AlexCuse에서 원래의 대답에 비해되지 않은 효율성을 찾을 수 놀랐습니다. 나는 FORMAT 기능 청소기를 찾을 수 있지만, 실행 시간의 측면에서 매우 효율적이지 않습니다. 내가 사용하는 집계 테이블은 64,000 기록을 가지고있다. 실행 시간의 효율성을 지적 마틴 스미스 했네.
SET STATISTICS TIME ON select FORMAT(N, 'd10') as padWithZeros from Tally SET STATISTICS TIME OFF
SQL 서버 실행 시간 : CPU 시간 = 2157 밀리 초, 경과 시간 = 2696 밀리.
SET STATISTICS TIME ON select right('0000000000'+ rtrim(cast(N as varchar(5))), 10) from Tally SET STATISTICS TIME OFF
SQL 서버 실행 시간 :
-
==============================
3.몇몇 사람들은이 버전을했다 :
몇몇 사람들은이 버전을했다 :
right('XXXXXXXXXXXX'+ @str, @n)
이 n보다 긴 경우는 실제 데이터를 자릅니다 때문에주의하십시오.
-
==============================
4.
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once SELECT RIGHT(@padstr + @str, @len)
-
==============================
5.아마이 이상 내가 패드 좌우 이러한 UDF를 가지고 죽일
아마이 이상 내가 패드 좌우 이러한 UDF를 가지고 죽일
ALTER Function [dbo].[fsPadLeft](@var varchar(200),@padChar char(1)='0',@len int) returns varchar(300) as Begin return replicate(@PadChar,@len-Len(@var))+@var end
오른쪽에
ALTER function [dbo].[fsPadRight](@var varchar(200),@padchar char(1)='0', @len int) returns varchar(201) as Begin --select @padChar=' ',@len=200,@var='hello' return @var+replicate(@PadChar,@len-Len(@var)) end
-
==============================
6.난하지 당신이 정말 비효율적 제공하지만, 다른 방법은, 오래가 길이나 패딩 문자에 유연하게 할 필요가 없기 때문에, ( "당신이 패드에 원하는 가정이 될 것이라고 방법이 0 "10 자 :
난하지 당신이 정말 비효율적 제공하지만, 다른 방법은, 오래가 길이나 패딩 문자에 유연하게 할 필요가 없기 때문에, ( "당신이 패드에 원하는 가정이 될 것이라고 방법이 0 "10 자 :
DECLARE @pad_characters VARCHAR(10) SET @pad_characters = '0000000000' SELECT RIGHT(@pad_characters + @str, 10)
-
==============================
7.아마 잔인한 사람, 나는 종종이 UDF를 사용 :
아마 잔인한 사람, 나는 종종이 UDF를 사용 :
CREATE FUNCTION [dbo].[f_pad_before](@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1)) RETURNS VARCHAR(255) AS BEGIN -- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character RETURN ltrim(rtrim( CASE WHEN LEN(@string) < @desired_length THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string ELSE @string END )) END
그래서 당신은 일을 같이 할 수 있습니다 :
select dbo.f_pad_before('aaa', 10, '_')
-
==============================
8.내가 vnRocks 솔루션을 좋아, 여기에는 UDF의 형태로
내가 vnRocks 솔루션을 좋아, 여기에는 UDF의 형태로
create function PadLeft( @String varchar(8000) ,@NumChars int ,@PadChar char(1) = ' ') returns varchar(8000) as begin return stuff(@String, 1, 0, replicate(@PadChar, @NumChars - len(@String))) end
-
==============================
9.이 왼쪽 패드에 간단한 방법입니다 :
이 왼쪽 패드에 간단한 방법입니다 :
REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)
여기서, x는 패드의 수이고, Y는 패드 문자이다.
견본:
REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
-
==============================
10.
select right(replicate(@padchar, @len) + @str, @len)
-
==============================
11.SQL Server 2005에서는 나중에 당신이 할 수있는 CLR 기능을 만들 수 있습니다.
SQL Server 2005에서는 나중에 당신이 할 수있는 CLR 기능을 만들 수 있습니다.
-
==============================
12.이건 어때:
이건 어때:
replace((space(3 - len(MyField))
3 패드에 0의 개수는
-
==============================
13.나는이 사람을 도움이되기를 바랍니다.
나는이 사람을 도움이되기를 바랍니다.
STUFF ( character_expression , start , length ,character_expression ) select stuff(@str, 1, 0, replicate('0', @n - len(@str)))
-
==============================
14.나는이 하나를 사용하십시오. 그것은 하나가 제공되지 않은 경우 당신은 당신이 결과이 원하는 길이뿐만 아니라 기본 패딩 문자를 확인할 수 있습니다. 물론 당신은 당신이로 실행하는 어떤 최대 값에 대한 입력 및 출력의 길이를 사용자 정의 할 수 있습니다.
나는이 하나를 사용하십시오. 그것은 하나가 제공되지 않은 경우 당신은 당신이 결과이 원하는 길이뿐만 아니라 기본 패딩 문자를 확인할 수 있습니다. 물론 당신은 당신이로 실행하는 어떤 최대 값에 대한 입력 및 출력의 길이를 사용자 정의 할 수 있습니다.
/*=============================================================== Author : Joey Morgan Create date : November 1, 2012 Description : Pads the string @MyStr with the character in : @PadChar so all results have the same length ================================================================*/ CREATE FUNCTION [dbo].[svfn_AMS_PAD_STRING] ( @MyStr VARCHAR(25), @LENGTH INT, @PadChar CHAR(1) = NULL ) RETURNS VARCHAR(25) AS BEGIN SET @PadChar = ISNULL(@PadChar, '0'); DECLARE @Result VARCHAR(25); SELECT @Result = RIGHT(SUBSTRING(REPLICATE('0', @LENGTH), 1, (@LENGTH + 1) - LEN(RTRIM(@MyStr))) + RTRIM(@MyStr), @LENGTH) RETURN @Result END
귀하의 마일리지가 다를 수 있습니다. :-) 조이 모건 프로그래머 / 분석가 교장 I WellPoint 메디 케이드 사업부
-
==============================
15.여기에 잘린 문자열을 방지하고 일반 팔자 'SQL을 사용하여 내 솔루션입니다. 솔루션이 코드의 기초 @AlexCuse, @Kevin 및 @Sklivvz, 감사합니다.
여기에 잘린 문자열을 방지하고 일반 팔자 'SQL을 사용하여 내 솔루션입니다. 솔루션이 코드의 기초 @AlexCuse, @Kevin 및 @Sklivvz, 감사합니다.
--[@charToPadStringWith] is the character you want to pad the string with. declare @charToPadStringWith char(1) = 'X'; -- Generate a table of values to test with. declare @stringValues table (RowId int IDENTITY(1,1) NOT NULL PRIMARY KEY, StringValue varchar(max) NULL); insert into @stringValues (StringValue) values (null), (''), ('_'), ('A'), ('ABCDE'), ('1234567890'); -- Generate a table to store testing results in. declare @testingResults table (RowId int IDENTITY(1,1) NOT NULL PRIMARY KEY, StringValue varchar(max) NULL, PaddedStringValue varchar(max) NULL); -- Get the length of the longest string, then pad all strings based on that length. declare @maxLengthOfPaddedString int = (select MAX(LEN(StringValue)) from @stringValues); declare @longestStringValue varchar(max) = (select top(1) StringValue from @stringValues where LEN(StringValue) = @maxLengthOfPaddedString); select [@longestStringValue]=@longestStringValue, [@maxLengthOfPaddedString]=@maxLengthOfPaddedString; -- Loop through each of the test string values, apply padding to it, and store the results in [@testingResults]. while (1=1) begin declare @stringValueRowId int, @stringValue varchar(max); -- Get the next row in the [@stringLengths] table. select top(1) @stringValueRowId = RowId, @stringValue = StringValue from @stringValues where RowId > isnull(@stringValueRowId, 0) order by RowId; if (@@ROWCOUNT = 0) break; -- Here is where the padding magic happens. declare @paddedStringValue varchar(max) = RIGHT(REPLICATE(@charToPadStringWith, @maxLengthOfPaddedString) + @stringValue, @maxLengthOfPaddedString); -- Added to the list of results. insert into @testingResults (StringValue, PaddedStringValue) values (@stringValue, @paddedStringValue); end -- Get all of the testing results. select * from @testingResults;
-
==============================
16.나는 이것이이 시점에서 대화를 많이 추가하지 않고, 내가 파일 생성 절차를 실행하는거야하고는 믿을 수 없을 정도로 느린 것 알고있다. 나는 복제를 사용하고이 트림 방법을보고 나는 그에게 기회를 줄 거라고 생각했습니다.
나는 이것이이 시점에서 대화를 많이 추가하지 않고, 내가 파일 생성 절차를 실행하는거야하고는 믿을 수 없을 정도로 느린 것 알고있다. 나는 복제를 사용하고이 트림 방법을보고 나는 그에게 기회를 줄 거라고 생각했습니다.
둘 사이의 스위치가 새로운 @padding 변수 (현재 존재하는 제한)에 추가됩니다 어디에 내 코드에서 볼 수 있습니다. 나는 실행 시간에 같은 결과 두 상태에서 함수 내 절차를 달렸다. SQLServer2016에서 적어도, 나는 다른 발견의 효율성에 차이를 보이지 않아요 그래서.
어쨌든, 여기 내 UDF 내가 년 전에 쓴입니다 플러스는 많이는 좌 / 우 PARAM 옵션 및 일부 오류 검사가 아닌 다른의와 같은 오늘을 변경합니다.
CREATE FUNCTION PadStringTrim ( @inputStr varchar(500), @finalLength int, @padChar varchar (1), @padSide varchar(1) ) RETURNS VARCHAR(500) AS BEGIN -- the point of this function is to avoid using replicate which is extremely slow in SQL Server -- to get away from this though we now have a limitation of how much padding we can add, so I've settled on a hundred character pad DECLARE @padding VARCHAR (100) = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' SET @padding = REPLACE(@padding, 'X', @padChar) SET @inputStr = RTRIM(LTRIM(@inputStr)) IF LEN(@inputStr) > @finalLength RETURN '!ERROR!' -- can search for ! in the returned text ELSE IF(@finalLength > LEN(@inputStr)) IF @padSide = 'L' SET @inputStr = RIGHT(@padding + @inputStr, @finalLength) --SET @inputStr = REPLICATE(@padChar, @finalLength - LEN(@inputStr)) + @inputStr ELSE IF @padSide = 'R' SET @inputStr = LEFT(@inputStr + @padding, @finalLength) --SET @inputStr = @inputStr + REPLICATE(@padChar, @finalLength - LEN(@inputStr)) -- if LEN(@inputStr) = @finalLength we just return it RETURN @inputStr; END -- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'R' ) from tblAccounts -- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'L' ) from tblAccounts
-
==============================
17.나는 하나 개의 기능을 가지고 그 X의 소수와 LPAD : FUNCTION [DBO]를 CREATE. LPAD_DEC] ( - 여기에 기능에 대한 매개 변수를 추가 @pad의 NVARCHAR (MAX) @string의 NVARCHAR (MAX) @length INT, @dec INT ) RETURNS이 NVARCHAR (최대) 같이 BEGIN - 여기 반환 변수를 선언 DECLARE의 @resp의 NVARCHAR (최대)
나는 하나 개의 기능을 가지고 그 X의 소수와 LPAD : FUNCTION [DBO]를 CREATE. LPAD_DEC] ( - 여기에 기능에 대한 매개 변수를 추가 @pad의 NVARCHAR (MAX) @string의 NVARCHAR (MAX) @length INT, @dec INT ) RETURNS이 NVARCHAR (최대) 같이 BEGIN - 여기 반환 변수를 선언 DECLARE의 @resp의 NVARCHAR (최대)
IF LEN(@string)=@length BEGIN IF CHARINDEX('.',@string)>0 BEGIN SELECT @resp = CASE SIGN(@string) WHEN -1 THEN -- Nros negativos grandes con decimales concat('-',SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec))) ELSE -- Nros positivos grandes con decimales concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(@string,@length,@dec))) END END ELSE BEGIN SELECT @resp = CASE SIGN(@string) WHEN -1 THEN --Nros negativo grande sin decimales concat('-',SUBSTRING(replicate(@pad,@length),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec))) ELSE -- Nros positivos grandes con decimales concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(@string,@length,@dec))) END END END ELSE IF CHARINDEX('.',@string)>0 BEGIN SELECT @resp =CASE SIGN(@string) WHEN -1 THEN -- Nros negativos con decimales concat('-',SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec))) ELSE --Ntos positivos con decimales concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec))) END END ELSE BEGIN SELECT @resp = CASE SIGN(@string) WHEN -1 THEN -- Nros Negativos sin decimales concat('-',SUBSTRING(replicate(@pad,@length-3),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec))) ELSE -- Nros Positivos sin decimales concat(SUBSTRING(replicate(@pad,@length),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec))) END END RETURN @resp
종료
-
==============================
18.필요한 경우 숫자 값은 두 개의 소수점 만에 제로 마우스 오른쪽 패딩 반올림 제공하기 위해 내가 가진 :
필요한 경우 숫자 값은 두 개의 소수점 만에 제로 마우스 오른쪽 패딩 반올림 제공하기 위해 내가 가진 :
DECLARE @value = 20.1 SET @value = ROUND(@value,2) * 100 PRINT LEFT(CAST(@value AS VARCHAR(20)), LEN(@value)-2) + '.' + RIGHT(CAST(@value AS VARCHAR(20)),2)
사람이 감사하겠습니다 깔끔한 방법, 생각할 수있는 경우 - 위의 서투른 것 같다.
참고 :이 경우에, 나는 데이터를 구문 분석하는 추가 도구를 포함하지 않고 정보의 형식을 HTML 형식의 소원 때문에 보고서를 이메일로 SQL 서버를 사용하고 있습니다.
-
==============================
19.다음은 어떻게 패드 포함 된 VARCHAR를 평소
다음은 어떻게 패드 포함 된 VARCHAR를 평소
WHILE Len(@String) < 8 BEGIN SELECT @String = '0' + @String END
from https://stackoverflow.com/questions/121864/most-efficient-t-sql-way-to-pad-a-varchar-on-the-left-to-a-certain-length by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL은 - 어떻게 저장하고 탐색 계층 구조가? (0) | 2020.03.21 |
---|---|
[SQL] BY GROUP은 열 CONCAT / 결합 [중복] (0) | 2020.03.21 |
[SQL] 어떻게 PostgreSQL의에서 ON 충돌로 RETURNING 사용 하는가? (0) | 2020.03.21 |
[SQL] 어떻게 두 MySQL의 테이블을 병합 할 수 있습니다? (0) | 2020.03.21 |
[SQL] 어떻게 아포스트로피 (작은 따옴표)를 포함하는 값을 삽입하려면? (0) | 2020.03.21 |