2013-03-08 166 views
52

我需要一个SQL语句来大写每个单词的首字母。其他字符必须小写。SQL:仅首字母大写

的话可以是这样的:

wezembeek-oppem 
roeselare 
BRUGGE 
louvain-la-neuve 

这将是:

Wezembeek-Oppem 
Roeselare 
Brugge 
Louvain-La-Neuve 

这应该是用一个UPDATE语句,我想更新一列的数据。 非常感谢您提前给出答案,我是一名SQL新手。

+4

看看这有助于http://stackoverflow.com/q/55054/285582 – bruno 2013-03-08 09:41:04

+0

谢谢,布鲁诺。您的链接提供了解决方案。 – samn 2013-03-08 10:08:30

回答

108

您是要求重命名列本身还是大写列中的数据?如果它的数据你已经改变,那么使用这个:

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]) 
+3

这不会处理连字符的情况。 – Bridge 2013-03-08 09:37:49

+0

是的,它将是现有列的更新,我将其添加到我的最初问题。 – samn 2013-03-08 09:39:30

+0

增加了一个尝试的答案来处理连字符的情况 - 没有测试,因为我在工作,所以它的一个快速尝试,可能需要调整。 – 2013-03-08 10:01:16

0
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)); 
+0

不是SQL Server的答案... – 2013-03-08 09:48:24

+0

雅我没有看到指定的数据库!我的错误.... 该查询应该是为Oracle数据库.. – Aspirant 2013-03-08 09:58:22

6

创建以下功能

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 
+0

您应该[属性您的代码源](https://www.sqlservercentral.com/Forums/FindPost993409.aspx)。 – 2017-12-07 11:07:53

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