복붙노트

[SQL] 대부분의 효율적인 T-SQL 패드 방식으로 일정한 길이로 왼쪽에 VARCHAR?

SQL

대부분의 효율적인 T-SQL 패드 방식으로 일정한 길이로 왼쪽에 VARCHAR?

비교 대답 :

REPLICATE(@padchar, @len - LEN(@str)) + @str

해결법

  1. ==============================

    1.이것은 단순히 SQL, 당신이 그것을 할 아무리의 비효율적 인 사용이다.

    이것은 단순히 SQL, 당신이 그것을 할 아무리의 비효율적 인 사용이다.

    같은 아마 뭔가

    right('XXXXXXXXXXXX'+ rtrim(@str), @n)
    

    X는 패딩 문자가와 결과 문자열의 문자 수는 @n이다 (당신이 고정 된 길이를 처리하기 때문에 당신이 패딩을 필요로 가정).

    하지만 당신이 정말로 데이터베이스에이 일을하지 않도록해야한다고 말했다한다.

  2. ==============================

    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. ==============================

    3.몇몇 사람들은이 버전을했다 :

    몇몇 사람들은이 버전을했다 :

    right('XXXXXXXXXXXX'+ @str, @n)
    

    이 n보다 긴 경우는 실제 데이터를 자릅니다 때문에주의하십시오.

  4. ==============================

    4.

    @padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once
    
    SELECT RIGHT(@padstr + @str, @len)
    
  5. ==============================

    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. ==============================

    6.난하지 당신이 정말 비효율적 제공하지만, 다른 방법은, 오래가 길이나 패딩 문자에 유연하게 할 필요가 없기 때문에, ( "당신이 패드에 원하는 가정이 될 것이라고 방법이 0 "10 자 :

    난하지 당신이 정말 비효율적 제공하지만, 다른 방법은, 오래가 길이나 패딩 문자에 유연하게 할 필요가 없기 때문에, ( "당신이 패드에 원하는 가정이 될 것이라고 방법이 0 "10 자 :

    DECLARE
       @pad_characters VARCHAR(10)
    
    SET @pad_characters = '0000000000'
    
    SELECT RIGHT(@pad_characters + @str, 10)
    
  7. ==============================

    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. ==============================

    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. ==============================

    9.이 왼쪽 패드에 간단한 방법입니다 :

    이 왼쪽 패드에 간단한 방법입니다 :

    REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)
    

    여기서, x는 패드의 수이고, Y는 패드 문자이다.

    견본:

    REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
    
  10. ==============================

    10.

    select right(replicate(@padchar, @len) + @str, @len)
    
  11. ==============================

    11.SQL Server 2005에서는 나중에 당신이 할 수있는 CLR 기능을 만들 수 있습니다.

    SQL Server 2005에서는 나중에 당신이 할 수있는 CLR 기능을 만들 수 있습니다.

  12. ==============================

    12.이건 어때:

    이건 어때:

    replace((space(3 - len(MyField))
    

    3 패드에 0의 개수는

  13. ==============================

    13.나는이 사람을 도움이되기를 바랍니다.

    나는이 사람을 도움이되기를 바랍니다.

    STUFF ( character_expression , start , length ,character_expression )
    
    select stuff(@str, 1, 0, replicate('0', @n - len(@str)))
    
  14. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    19.다음은 어떻게 패드 포함 된 VARCHAR를 평소

    다음은 어떻게 패드 포함 된 VARCHAR를 평소

    WHILE Len(@String) < 8
    BEGIN
        SELECT @String = '0' + @String
    END
    
  20. 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