SQL: alleen de eerste letter hoofdletter

Ik heb een SQL-instructie nodig om de eerste letter van elk woord in hoofdletters te zetten. De andere letters moeten kleine letters zijn.

De woorden kunnen er zo uitzien:

wezembeek-oppem
roeselare
BRUGGE
louvain-la-neuve

Dat zou moeten zijn:

Wezembeek-Oppem
Roeselare
Brugge
Louvain-La-Neuve

Dit moet met een UPDATE statement, ik wil de gegevens van een kolom bijwerken. Bij voorbaat hartelijk dank voor jullie antwoorden, ik'ben een SQL beginneling.

Oplossing

Vraag je om de naam van de kolom zelf te veranderen of om de gegevens in de kolom een hoofdletter te geven? Als je de gegevens wilt veranderen, gebruik dan dit:

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

Als je het alleen maar wilt veranderen om het weer te geven en niet om de eigenlijke gegevens in de tabel te veranderen:

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

Hoop dat dit helpt.

EDIT: Ik realiseerde me over de '-' dus hier is mijn poging om dit probleem op te lossen in een functie.


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 
Commentaren (8)

Maak de onderstaande functie

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 ;

Roep het dan aan als

select dbo.InitialCap(columnname) from yourtable
Commentaren (1)

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
Commentaren (2)