2013-03-08 42 views
52

Potrzebuję instrukcji SQL, aby zamieniła wielką literę na pierwszą literę każdego słowa. Pozostałe znaki muszą być pisane małymi literami.SQL: pierwsza litera tylko wielkiej litery

Słowa mogą być tak:

wezembeek-oppem 
roeselare 
BRUGGE 
louvain-la-neuve 

które musiałyby być:

Wezembeek-Oppem 
Roeselare 
Brugge 
Louvain-La-Neuve 

To powinno być z instrukcji UPDATE, chcę zaktualizować dane z kolumny. Dziękuję bardzo za odpowiedzi z góry, jestem nowicjuszem SQL.

+4

Zobacz, czy to pomaga http://stackoverflow.com/q/55054/285582 – bruno

+0

Dzięki Bruno. Twój link dostarczył rozwiązanie. – samn

Odpowiedz

108

Czy chcesz zmienić nazwę kolumny lub wpisać do niej dane w kolumnie? Jeśli jego dane masz zmienić, a następnie użyj tego:

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

Jeśli tylko chciał go zmienić tylko do wyświetlania i nie potrzebują rzeczywistych danych w tabeli, aby zmienić:

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

Nadzieja to pomaga.

EDYCJA: Zdałem sobie sprawę z "-", więc oto moja próba rozwiązania tego problemu w funkcji.

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 

Więc kod byłoby:

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

Nie będzie obsługiwać dzielonych przypadków. – Bridge

+0

tak, byłaby to aktualizacja istniejącej kolumny, dodałem to do mojego pierwszego pytania. – samn

+0

dodał próbę odpowiedzi, aby poradzić sobie z dzielonymi sprawami - nie testowany, ponieważ jestem w pracy, więc jest to szybka próba, może wymagać poprawienia. –

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

Brak odpowiedzi serwera SQL ... –

+0

ya Nie widziałem podanej bazy danych !! mój błąd .... Pytanie dotyczy Oracle db .. – Aspirant

6

Tworzenie poniższego funkcję

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 ; 

Następnie nazwać jak

select dbo.InitialCap(columnname) from yourtable 
+0

Powinieneś [przypisać źródła kodu] (https://www.sqlservercentral.com/Forums/FindPost993409.aspx). –

3

Proszę sprawdzić kwerendy bez używania funkcji:

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 
Powiązane problemy