복붙노트

[SQL] 내장 기능은 각 단어의 첫 글자를 대문자로

SQL

내장 기능은 각 단어의 첫 글자를 대문자로

이 경우 내가 그에 대한 사용자 정의 함수를 생성하지 않으려는 이미 SQL 서버에 존재

입력 문자열 :이 변환에 내 문자열 예상 출력 :이 내 문자열로의 변환

해결법

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

    1.

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) 
    RETURNS VARCHAR(4000)
    AS
    BEGIN
    
    DECLARE @Index          INT
    DECLARE @Char           CHAR(1)
    DECLARE @PrevChar       CHAR(1)
    DECLARE @OutputString   VARCHAR(255)
    
    SET @OutputString = LOWER(@InputString)
    SET @Index = 1
    
    WHILE @Index <= LEN(@InputString)
    BEGIN
        SET @Char     = SUBSTRING(@InputString, @Index, 1)
        SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                             ELSE SUBSTRING(@InputString, @Index - 1, 1)
                        END
    
        IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
        BEGIN
            IF @PrevChar != '''' OR UPPER(@Char) != 'S'
                SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
        END
    
        SET @Index = @Index + 1
    END
    
    RETURN @OutputString
    
    END
    
    
    
    Declare @str nvarchar(100)
    SET @str = 'my string to convert'
    SELECT @str = [dbo].[InitCap](@str)
    SELECT @str 
    
  2. ==============================

    2.AFAIK은 SQL 서버는 기본 제공되지-에있다 기능이를 위해. 당신은 사용자 정의 함수를 작성해야합니다.

    AFAIK은 SQL 서버는 기본 제공되지-에있다 기능이를 위해. 당신은 사용자 정의 함수를 작성해야합니다.

    이 시도.

    CREATE FUNCTION [dbo].[CamelCase]
    (@Str varchar(8000))
    RETURNS varchar(8000) AS
    BEGIN
      DECLARE @Result varchar(2000)
      SET @Str = LOWER(@Str) + ' '
      SET @Result = ''
      WHILE 1=1
      BEGIN
        IF PATINDEX('% %',@Str) = 0 BREAK
        SET @Result = @Result + UPPER(Left(@Str,1))+
        SubString  (@Str,2,CharIndex(' ',@Str)-1)
        SET @Str = SubString(@Str,
          CharIndex(' ',@Str)+1,Len(@Str))
      END
      SET @Result = Left(@Result,Len(@Result))
      RETURN @Result
    END  
    

    출력 :

    Input String    : 'microSoft sql server'
    Output String   : 'Microsoft Sql Server'
    
  3. ==============================

    3.나는 "존재하지 않는 아니,"함께 가야 할 것입니다. 이는 SQL 서버 2008 R2에서 T-SQL에서 사용할 수있는 문자열 기능과 꽤 최근 5 일 과정을 숙독 몇 년을 기준으로.

    나는 "존재하지 않는 아니,"함께 가야 할 것입니다. 이는 SQL 서버 2008 R2에서 T-SQL에서 사용할 수있는 문자열 기능과 꽤 최근 5 일 과정을 숙독 몇 년을 기준으로.

    물론, 나는 아직도 잘못 :) 수 있습니다.

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

    4.당신의 작업의 목표는 적절한 대문자가 아닌 알파벳 문자로 구분 된 각 단어의 첫 글자로 정의 될 수있는 이름의 문자열을 값 싸게 치장하는 경우.

    당신의 작업의 목표는 적절한 대문자가 아닌 알파벳 문자로 구분 된 각 단어의 첫 글자로 정의 될 수있는 이름의 문자열을 값 싸게 치장하는 경우.

    고려하지 않는 기타 솔루션 :

    참고 : 내 솔루션은 예외를 처리하지 않습니다. 당신은 매우 사람들에 대해 우려하는 경우, 나는이 사람들을 위해 어셈블리 CLR C 번호를 작성하는 것이 좋습니다 것은 까다로운 될 것이며, 문자열은 어디에 C # 개에 탁월 지역이기 때문에. 여기에 또 다른 해결책은 이것에 대한 계정에 시도하지만 여전히 "이반 끔찍한 IV가"출력 "** IV *** 끔찍 IV를 *"걸릴 것이다.

    이것은 내가 생각 해낸 기능입니다 :

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fs_PascalCase]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    DROP FUNCTION [dbo].[fs_PascalCase]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE FUNCTION [dbo].[fs_PascalCase]
    (
        @Text nVarChar(MAX)
    )
    RETURNS nVarChar(MAX)
    AS
    BEGIN
            SET @Text = LOWER(@Text)--This step is optional.  Keep if you want the code below to control all casing. - 11/26/2013 - MCR.
        DECLARE @New nVarChar(MAX) = (CASE WHEN @Text IS NULL THEN NULL ELSE '' END)--Still return null when source is null. - 11/26/2013 - MCR.
        DECLARE @Len   Int = LEN(REPLACE(@Text, ' ', '_'))--If you want to count/keep trailing-spaces, you MUST use this!!! - 11/26/2013 - MCR.
        DECLARE @Index Int = 1--Sql-Server is 1-based, not 0-based.
        WHILE (@Index <= @Len)
            IF (SUBSTRING(@Text, @Index, 1) LIKE '[^a-z]' AND @Index + 1 <= @Len)--If not alpha and there are more character(s).
                SELECT @New = @New + UPPER(SUBSTRING(@Text, @Index, 2)), @Index = @Index + 2
            ELSE
                SELECT @New = @New +       SUBSTRING(@Text, @Index, 1) , @Index = @Index + 1
    
        --If @Text is null, then @Len will be Null, and everything will be null.
        --If @Text is '',   then (@Len - 1) will be -1, so ABS() it to use 1 instead, which will still return ''.
        RETURN ( UPPER(LEFT(@New, 1)) + RIGHT(@New, ABS(@Len - 1)) )
    END
    GO
    

    당신은 너무처럼 부를 것이다 :

    SELECT dbo.fs_PascalCase(NULL)[Null],
           dbo.fs_PascalCase('')[EmptyString],
           dbo.fs_PascalCase('hello   how are-you TODAY    ')[LongString]
    

    출력은 다음과 같이 표시됩니다

  5. ==============================

    5.내 전략

    내 전략

    코드

    여기 내 원래의 게시물이에있다 : SQL 서버에서 낙타 케이스에 문자열 변환

    CREATE FUNCTION [dbo].[GetCamelCaseName]
    (
        @Name varchar(50)
    )
    RETURNS VARCHAR(50) WITH SCHEMABINDING
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @NameCamelCase VARCHAR(50)  
    
        -- This is determining whether or not the name is in camel case already (if the 1st character is uppercase
        -- and the third is lower (because the 2nd could be an apostrophe).  To do this, you have to cast the 
        -- character as varbinary and compare it with the upper case of the character cast as varbinary.  
    
        IF (CAST(SUBSTRING(@Name, 1,1) as varbinary) = CAST(SUBSTRING(UPPER(@Name), 1, 1) as varbinary)         
                AND ((CAST(SUBSTRING(@Name, 2,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 2, 1) as varbinary)
                        AND SUBSTRING(@Name, 2,1) != '''')
                    or
                    (CAST(SUBSTRING(@Name, 4,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 4, 1) as varbinary)
                        AND SUBSTRING(@Name, 2,1) = '''')))
    
            BEGIN
                SELECT @NameCamelCase = RTRIM(LTRIM(@Name))
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')           
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')       
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II')   
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III')
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ')
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald')
    
                if (@NameCamelCase LIKE '% iv') -- avoid changing "Ivan" to "IVan"
                    SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV')
    
                if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv'))
                    SELECT @NameCamelCase = UPPER(@NameCamelCase)
    
                RETURN @NameCamelCase       
    
            END
    
        ELSE
    
            BEGIN       
    
                SELECT @NameCamelCase = RTRIM(LTRIM(@Name))
    
                -- "Mc-"
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @Name LIKE 'mc%'
                            THEN UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 1)) + UPPER(SUBSTRING(@Name, 3, 1))  + LOWER(SUBSTRING(@Name, 4, 47))
                        ELSE
                           UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 49))
                    END
    
                -- Apostrophes
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '%''%'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('''', @NameCamelCase) - 1) + ''''  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
    
                -- Hyphenated names (do it twice to account for double hyphens)
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '%-%'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^'  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '%-%'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^'  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, '^', '-')
    
                -- Multiple word names (do it twice to account for three word names)
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '% %'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?'  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '% %'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?'  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, '?', ' ')
    
                -- Names in Parentheses         
                SELECT @NameCamelCase = 
                    CASE 
                        WHEN @NameCamelCase LIKE '%(%'
                            THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('(', @NameCamelCase) - 1) + '('  + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 2, 50)
                        ELSE
                            @NameCamelCase
                    END 
    
    
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')           
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')           
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II')
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III')
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ')
                SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald')
    
                if (@NameCamelCase LIKE '% iv')
                    SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV')
    
                if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv'))
                    SELECT @NameCamelCase = UPPER(@NameCamelCase)
    
                -- Return the result of the function
                RETURN ISNULL(@NameCamelCase, '')
    
            END
    
        RETURN ISNULL(@NameCamelCase, '')
    
    END
    
  6. ==============================

    6.SQL 2017와 기능은 다음과 같이 수 :

    SQL 2017와 기능은 다음과 같이 수 :

    create function dbo.cap_words (@str varchar(max))
    returns varchar(max)
    as
    begin
        declare @result varchar(max);
        select @result = string_agg( upper(left(value,1)) + substring(value,2,999),' ') from string_split(lower(@str),' ') 
        return @result;
    end
    
  7. ==============================

    7.여기에 간단한 점은 복잡하지 않습니다이다.

    여기에 간단한 점은 복잡하지 않습니다이다.

    신탁: 이중 FROM ()이 변환 MY 문자열 '(아래) INITCAP SELECT;

  8. from https://stackoverflow.com/questions/5164201/built-in-function-to-capitalise-the-first-letter-of-each-word by cc-by-sa and MIT license