복붙노트

[SQL] SQL은 : 첫 글자를 대문자 만 [중복]

SQL

SQL은 : 첫 글자를 대문자 만 [중복]

나는 각 단어의 첫 글자를 대문자로 SQL 문이 필요합니다. 다른 문자는 소문자로해야한다.

단어는 다음과 같이 할 수있다 :

wezembeek-oppem
roeselare
BRUGGE
louvain-la-neuve

어떤 될 것이다 :

Wezembeek-Oppem
Roeselare
Brugge
Louvain-La-Neuve

이 UPDATE 문으로해야한다, 나는 열의 데이터를 업데이트 할 수 있습니다. 내가 SQL 초보자 해요, 사전에 귀하의 답변 대단히 감사합니다.

해결법

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

    1.당신은 열 내부의 데이터를 컬럼 자체의 이름을 바꾸거나 투자를 요구하고 있습니까? 당신이 변화했습니다 데이터, 다음이를 사용 :

    당신은 열 내부의 데이터를 컬럼 자체의 이름을 바꾸거나 투자를 요구하고 있습니까? 당신이 변화했습니다 데이터, 다음이를 사용 :

    UPDATE [yourtable]
    SET word=UPPER(LEFT(word,1))+LOWER(SUBSTRING(word,2,LEN(word)))
    

    당신은 단지에만 표시를 변경을 원하고 할 경우 변화에 테이블의 실제 데이터를 필요로하지 :

    SELECT UPPER(LEFT(word,1))+LOWER(SUBSTRING(word,2,LEN(word))) FROM [yourtable]
    

    도움이 되었기를 바랍니다.

    편집 : 나는에 대해 실현 '-'그래서 여기에 함수에서이 문제를 해결하는 나의 시도이다.

    CREATE FUNCTION [dbo].[CapitalizeFirstLetter]
    (
    --string need to format
    @string VARCHAR(200)--increase the variable size depending on your needs.
    )
    RETURNS VARCHAR(200)
    AS
    
    BEGIN
    --Declare Variables
    DECLARE @Index INT,
    @ResultString VARCHAR(200)--result string size should equal to the @string variable size
    --Initialize the variables
    SET @Index = 1
    SET @ResultString = ''
    --Run the Loop until END of the string
    
    WHILE (@Index <LEN(@string)+1)
    BEGIN
    IF (@Index = 1)--first letter of the string
    BEGIN
    --make the first letter capital
    SET @ResultString =
    @ResultString + UPPER(SUBSTRING(@string, @Index, 1))
    SET @Index = @Index+ 1--increase the index
    END
    
    -- IF the previous character is space or '-' or next character is '-'
    
    ELSE IF ((SUBSTRING(@string, @Index-1, 1) =' 'or SUBSTRING(@string, @Index-1, 1) ='-' or SUBSTRING(@string, @Index+1, 1) ='-') and @Index+1 <> LEN(@string))
    BEGIN
    --make the letter capital
    SET
    @ResultString = @ResultString + UPPER(SUBSTRING(@string,@Index, 1))
    SET
    @Index = @Index +1--increase the index
    END
    ELSE-- all others
    BEGIN
    -- make the letter simple
    SET
    @ResultString = @ResultString + LOWER(SUBSTRING(@string,@Index, 1))
    SET
    @Index = @Index +1--incerase the index
    END
    END--END of the loop
    
    IF (@@ERROR
    <> 0)-- any error occur return the sEND string
    BEGIN
    SET
    @ResultString = @string
    END
    -- IF no error found return the new string
    RETURN @ResultString
    END
    

    그럼 코드는 다음과 같습니다

    UPDATE [yourtable]
    SET word=dbo.CapitalizeFirstLetter([STRING TO GO HERE])
    
  2. ==============================

    2.아래의 함수를 만듭니다

    아래의 함수를 만듭니다

    Alter FUNCTION InitialCap(@String VARCHAR(8000))
                      RETURNS VARCHAR(8000)
                     AS
     BEGIN 
    
                       DECLARE @Position INT;
    
    SELECT @String   = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) COLLATE Latin1_General_Bin,
                        @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String COLLATE Latin1_General_Bin);
    
                        WHILE @Position > 0
                        SELECT @String   = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin,
                        @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String COLLATE Latin1_General_Bin);
    
                         RETURN @String;
      END ;
    

    다음과 같이 호출

    select dbo.InitialCap(columnname) from yourtable
    
  3. ==============================

    3.기능을 사용하지 않고 쿼리를 확인하시기 바랍니다 :

    기능을 사용하지 않고 쿼리를 확인하시기 바랍니다 :

    declare @T table(Insurance varchar(max))
    
    insert into @T values ('wezembeek-oppem')
    insert into @T values ('roeselare')
    insert into @T values ('BRUGGE')
    insert into @T values ('louvain-la-neuve')
    
    select (
           select upper(T.N.value('.', 'char(1)'))+
                    lower(stuff(T.N.value('.', 'varchar(max)'), 1, 1, ''))+(CASE WHEN RIGHT(T.N.value('.', 'varchar(max)'), 1)='-' THEN '' ELSE ' ' END)
           from X.InsXML.nodes('/N') as T(N)
           for xml path(''), type
           ).value('.', 'varchar(max)') as Insurance
    from 
      (
      select cast('<N>'+replace(
                replace(
                    Insurance, 
                    ' ', '</N><N>'),
                '-', '-</N><N>')+'</N>' as xml) as InsXML
      from @T
      ) as X
    
  4. ==============================

    4.

    select replace(wm_concat(new),',','-') exp_res from (select distinct initcap(substr(name,decode(level,1,1,instr(name,'-',1,level-1)+1),decode(level,(length(name)-length(replace(name,'-','')))+1,9999,instr(name,'-',1,level)-1-decode(level,1,0,instr(name,'-',1,level-1))))) new from table;
    connect by level<= (select (length(name)-length(replace(name,'-','')))+1 from table));
    
  5. from https://stackoverflow.com/questions/15290754/sql-capitalize-first-letter-only by cc-by-sa and MIT license