복붙노트

[SQL] SQL에서 대문자로 분할 단어

SQL

SQL에서 대문자로 분할 단어

누구 아는 방법 문자열에서 대문자로 시작하는 단어를 분할합니까?

예:

    DECLARE @var1 varchar(100) = 'OneTwoThreeFour'
    DECLARE @var2 varchar(100) = 'OneTwoThreeFourFive'
    DECLARE @var3 varchar(100) = 'One'

    SELECT @var1 as Col1, <?> as Col2
    SELECT @var2 as Col1, <?> as Col2
    SELECT @var3 as Col1, <?> as Col2

예상 결과:

    Col1                Col2
    OneTwoThreeFour     One Two three Four
    OneTwoThreeFourFive One Two Three Four Five
    One                 One

이 (또는 너무 긴 경우) 수없는 경우 라 함수는 괜찮을뿐만 아니라 것입니다.

해결법

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

    1.여기에 "제거 알파벳이 아닌 문자"와 유사하다 내가 만든 기능입니다. 어떻게 SQL Server의 문자열에서 모든 알파벳이 아닌 문자를 제거하려면?

    여기에 "제거 알파벳이 아닌 문자"와 유사하다 내가 만든 기능입니다. 어떻게 SQL Server의 문자열에서 모든 알파벳이 아닌 문자를 제거하려면?

    적극적 후 비 공간 / 대문자 조합을 추구하고 이것은 사용하는 경우 구분 데이터 정렬은 공백을 삽입하기 위해 물건 함수를 사용합니다. 일부 사람들은 바로이 느린 다른 솔루션에 비해 될 것이라고 말할 것이다, 그래서 이것은 스칼라 UDF입니다. 그 개념에, 나는 말을 테스트 해보십시오. 이 기능은 모든 테이블 데이터를 사용하고 가능성이 당신에게 아주 좋은 성능을 제공 할 수 있도록 오직 필요한만큼 여러 번 루프하지 않습니다.

    Create Function dbo.Split_On_Upper_Case(@Temp VarChar(1000))
    Returns VarChar(1000)
    AS
    Begin
    
        Declare @KeepValues as varchar(50)
        Set @KeepValues = '%[^ ][A-Z]%'
        While PatIndex(@KeepValues collate Latin1_General_Bin, @Temp) > 0
            Set @Temp = Stuff(@Temp, PatIndex(@KeepValues collate Latin1_General_Bin, @Temp) + 1, 0, ' ')
    
        Return @Temp
    End
    

    이처럼 전화 :

    Select dbo.Split_On_Upper_Case('OneTwoThreeFour')
    Select dbo.Split_On_Upper_Case('OneTwoThreeFour')
    Select dbo.Split_On_Upper_Case('One')
    Select dbo.Split_On_Upper_Case('OneTwoThree')
    Select dbo.Split_On_Upper_Case('stackOverFlow')
    Select dbo.Split_On_Upper_Case('StackOverFlow')
    
  2. ==============================

    2.여기에 내가 방금 만든 기능입니다.

    여기에 내가 방금 만든 기능입니다.

    함수

    CREATE FUNCTION dbo.Split_On_Upper_Case
     (
         @String VARCHAR(4000)
     )
    RETURNS VARCHAR(4000)
    AS
    BEGIN
    
    DECLARE @Char CHAR(1);
    DECLARE @i    INT = 0;
    DECLARE @OutString VARCHAR(4000) = '';
    
    
    WHILE (@i <= LEN(@String))
    BEGIN
        SELECT @Char = SUBSTRING(@String, @i,1)
    
        IF (@Char = UPPER(@Char) Collate Latin1_General_CS_AI) 
           SET @OutString = @OutString + ' ' + @Char;
        ELSE 
           SET @OutString = @OutString +  @Char;
    
         SET @i += 1;
    END
    
     SET @OutString =  LTRIM(@OutString);
    
     RETURN @OutString;
    
    END 
    

    테스트 데이터

    DECLARE @TABLE TABLE (Strings VARCHAR(1000))
    INSERT INTO @TABLE 
    VALUES ('OneTwoThree')   ,
           ('FourFiveSix')   ,
           ('SevenEightNine')
    

    질문

    SELECT dbo.Split_On_Upper_Case(Strings) AS Vals
    FROM @TABLE
    

    설정 결과

    ╔══════════════════╗
    ║       Vals       ║
    ╠══════════════════╣
    ║ One Two Three    ║
    ║ Four Five Six    ║
    ║ Seven Eight Nine ║
    ╚══════════════════╝
    
  3. ==============================

    3.번호 테이블을 구축 할 수 있습니다. 어떻게이 작업을 수행하는 방법을 보여 SO에서 눈부신 게시물이 있습니다. 당신의 입력 문자열의 최대 길이를 최대 값으로 채 웁니다. 현재 입력 문자열의 실제 길이 1에서 값을 선택한다. 크로스는 입력 문자열의 숫자의 목록을 가입 할 수 있습니다. SUBSTRING에 대한 결과 () 각 문자를 사용합니다. 그런 다음 중 하나를 미리 채워진 테이블 반환 변수에 한 charachter 값의 결과 목록을 비교하거나 ASCII를 (사용하여 정수로 각 문자를 변환)를 선택 할 수 있습니다 만 (65) ( 'A') 90 ( 'Z'사이의 그 ). 이 시점에서 당신은 당신의 입력 문자열의 각 대문자 문자의 위치입니다 목록을 가지고있다. UNION리스트의 마지막 위에 당신의 입력 문자열의 최대 길이. 왜 잠깐에서는 볼 수 있습니다. (행 N에 의해 ​​주어진 수) - 이제 당신은 행 N에 의해 ​​주어진 수에서 시작하여 (행 N + 1에 의해 주어진 번호)의 길이를 가지고, () 사용자의 입력 변수를 문자열 수 있습니다. 당신이 UNION에 끝 부분에있는 여분의 번호를 가지고 이유입니다. 마지막으로는 CONCATENATE 모든 당신의 선택의 알고리즘을 사용하여, 공간이 구분 함께 하위 문자열.

    번호 테이블을 구축 할 수 있습니다. 어떻게이 작업을 수행하는 방법을 보여 SO에서 눈부신 게시물이 있습니다. 당신의 입력 문자열의 최대 길이를 최대 값으로 채 웁니다. 현재 입력 문자열의 실제 길이 1에서 값을 선택한다. 크로스는 입력 문자열의 숫자의 목록을 가입 할 수 있습니다. SUBSTRING에 대한 결과 () 각 문자를 사용합니다. 그런 다음 중 하나를 미리 채워진 테이블 반환 변수에 한 charachter 값의 결과 목록을 비교하거나 ASCII를 (사용하여 정수로 각 문자를 변환)를 선택 할 수 있습니다 만 (65) ( 'A') 90 ( 'Z'사이의 그 ). 이 시점에서 당신은 당신의 입력 문자열의 각 대문자 문자의 위치입니다 목록을 가지고있다. UNION리스트의 마지막 위에 당신의 입력 문자열의 최대 길이. 왜 잠깐에서는 볼 수 있습니다. (행 N에 의해 ​​주어진 수) - 이제 당신은 행 N에 의해 ​​주어진 수에서 시작하여 (행 N + 1에 의해 주어진 번호)의 길이를 가지고, () 사용자의 입력 변수를 문자열 수 있습니다. 당신이 UNION에 끝 부분에있는 여분의 번호를 가지고 이유입니다. 마지막으로는 CONCATENATE 모든 당신의 선택의 알고리즘을 사용하여, 공간이 구분 함께 하위 문자열.

    죄송합니다, 코드를 시도하는 내 앞에 인스턴스를 필요가 없습니다. 사운드는 재미있는 작업을 좋아한다. 나는 중첩 된 SELECT 뒤얽힌 얻을 것이다 문과 않은 유지 보수와 함께 그 일을 생각; 더 나은 CTE를, 이럴로 배치합니다.

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

    4.단일 쿼리가 26 필요한 경우처럼 모든 대문자를 확인하는 데 사용할 수 있습니다 교체

    단일 쿼리가 26 필요한 경우처럼 모든 대문자를 확인하는 데 사용할 수 있습니다 교체

    SELECT @var1 col1, REPLACE(
                        REPLACE(
                         REPLACE(
                          ...
                           REPLACE(@var1, 'A', ' A')
                        , ... 
                      , 'X', ' X')
                    , 'Y', ' Y')
                  , 'Z', ' Z') col2
    

    아니 가장 아름다운 일이지만이 일 것입니다.

    편집하다 그냥 다른 답변의 다른 방법으로 같은 일을하는 다른 기능을 추가하는

    CREATE FUNCTION splitCapital (@param Varchar(MAX))
    RETURNS Varchar(MAX)
    BEGIN
      Declare @ret Varchar(MAX) = '';
      declare @len int = len(@param);
    
      WITH Base10(N) AS (
                  SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
        UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 
        UNION ALL SELECT 8 UNION ALL SELECT 9
      ), Chars(N) As (
        Select TOP(@len)
               nthChar 
             = substring(@param, u.N + t.N*10 + h.N*100 + th.N*1000 + 1, 1) 
               Collate Latin1_General_CS_AI
        FROM   Base10 u
               CROSS JOIN Base10 t
               CROSS JOIN Base10 h
               CROSS JOIN Base10 th
        WHERE  u.N + t.N*10 + h.N*100 + th.N*1000 < @len
        ORDER BY u.N + t.N*10 + h.N*100 + th.N*1000
      )
      SELECT @ret += Case nthChar 
                          When UPPER(nthChar) Then ' ' 
                          Else '' 
                     End + nthChar
      FROM   Chars
    
      RETURN @ret;
    END
    

    이 사람은 CONCATENATE 문자열 변수에 TSQL의 가능성을 사용, 나는 올바른 순서에 숯을 CTE 행을 강제로 TOP N의 트릭을 사용했다

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

    5.나는 거기 좋은 답변이 이미 있다는 것을 알고 있지만, 당신은 함수를 만들지 않도록하기를 원한다면, 당신은 또한 이러한 목표를 달성하기 위해 재귀 CTE를 사용할 수 있습니다. 확실히이 일의 깨끗한 방법은 아니지만, 그것을 작동합니다.

    나는 거기 좋은 답변이 이미 있다는 것을 알고 있지만, 당신은 함수를 만들지 않도록하기를 원한다면, 당신은 또한 이러한 목표를 달성하기 위해 재귀 CTE를 사용할 수 있습니다. 확실히이 일의 깨끗한 방법은 아니지만, 그것을 작동합니다.

    DECLARE
        @camelcase nvarchar(4000) = 'ThisIsCamelCased'
    ;
    
    WITH
        split
    AS
        (
            SELECT
                  [iteration]   = 0
                 ,[string]      = @camelcase
    
            UNION ALL
    
            SELECT
                 [iteration]    = split.[iteration] + 1
                ,[string]       = STUFF(split.[string], pattern.[index] + 1, 0, ' ')
            FROM
                split
            CROSS APPLY
                ( SELECT [index] = PATINDEX(N'%[^ ][A-Z]%' COLLATE Latin1_General_Bin, split.[string]) )
                pattern
            WHERE
                pattern.[index] > 0
        )
    SELECT TOP (1)
        [spaced] = split.[string]
    FROM
        split
    ORDER BY
        split.[iteration]   DESC
    ;
    

    내가 말했듯이,이 쿼리를 작성하는 꽤 방법이 아니다,하지만 난 그냥 임시 쿼리 나 데이터베이스에 새 아티팩트를 추가하고 싶지 않아요까지 쓰고 때이 같은 일을 사용합니다. 또한 항상 태드 좋네요 인라인 테이블 값 함수로 함수를 만들려면이를 사용할 수 있습니다.

  6. ==============================

    6.이 시도하십시오 :

    이 시도하십시오 :

        declare  @t nvarchar (100) ='IamTheTestString'  
        declare  @len int
        declare  @Counter int =0 
        declare  @Final nvarchar (100) =''
        set @len =len( @t)
    
    
        while (@Counter <= @len)
        begin 
    
        set @Final= @Final + Case when  ascii(substring (@t,@Counter,1))>=65 and  
        ascii(substring (@t,@Counter,1))<=90 then ' '+substring (@t,@Counter,1) else 
        substring (@t,@Counter,1) end
    
    
        set @Counter=@Counter+1
        end
    
        print ltrim(@Final)
    
  7. from https://stackoverflow.com/questions/23470794/split-words-with-a-capital-letter-in-sql by cc-by-sa and MIT license