SQL: заглавная только первая буква [дубликат]
этот вопрос уже есть ответ здесь:
мне нужен оператор SQL для заглавной буквы первой буквы каждого слова. Остальные символы должны быть строчными.
слова могут быть как это:
wezembeek-oppem
roeselare
BRUGGE
louvain-la-neuve
что будет:
Wezembeek-Oppem
Roeselare
Brugge
Louvain-La-Neuve
Это должно быть с оператором UPDATE, я хочу обновить данные столбца. Спасибо Вам большое за ваши ответы заранее, я новичок SQL.
4 ответа:
вы просите переименовать сам столбец или капитализировать данные внутри столбца? Если его данные вы должны изменить, то используйте это:
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]
надеюсь, что это помогает.
EDIT: я понял о '-' так вот моя попытка решить эту проблему в функции.
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])
создать функцию ниже
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
пожалуйста, проверьте запрос без использования функции:
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
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));