Discussion:
Hoofdletters naar kleine letters
(te oud om op te antwoorden)
Alison Givens
2005-12-06 13:47:41 UTC
Permalink
Het volgende.
In een kolom van mijn tabel staat de tekst in allemaal hoofdletters.
Nu wil ik graag bij de weergave van mijn query, de eerste letter van dit
veld met een hoofdletter en de rest met kleine letters.
Is dit in een query te verwezenlijken?
SQL
2005-12-06 14:35:35 UTC
Permalink
create table #temp (SomeName varchar(50))
insert into #temp
select 'SINTERKLAAS' UNION ALL
select 'MARCO' UNION ALL
select 'AJAX' UNION ALL
select 'AMSTERDAM'

SELECT LEFT(SomeName,1) + LOWER(right(SomeName,len(Somename) -1)) FROM
#temp


http://sqlservercode.blogspot.com/
Alison Givens
2006-01-19 14:55:01 UTC
Permalink
Dit werkt niet helemaal goed.
Bij sommige tekst gaat het goed, maar bij sommige tekst worden de tweede en
derde letter weggelaten.
CV-KLEIN wordt inderdaad Cv-klein, maar BOILER wordt Bler.

Hier de query waar het in staat. Het veld waar ik dit bij wil toepassen,
komt ook in de GROUP voor.
(daar zit hem de fout denk ik niet, want in een andere tabel werkt het ook
niet)

SELECT COUNT(DISTINCT (CASE WHEN boeking.artikel_nr LIKE 'FWERK%' OR
boeking.artikel_nr LIKE 'FREIS%' THEN (opdracht.bonnr)
END)) AS Werkbonnen, boeking.boekdatum,
SUM(CASE WHEN NOT boeking.artikel_nr LIKE 'FWERK%' AND
NOT boeking.artikel_nr LIKE 'FREIS%' THEN boeking.aantal END) AS
AllesGeboekt,
SUM(CASE WHEN boeking.artikel_nr LIKE 'FWERK%' THEN
boeking.aantal END) AS Werk,
SUM(CASE WHEN boeking.artikel_nr LIKE 'FREIS%' THEN
boeking.aantal END) AS Reis, SUM(CASE WHEN boeking.artikel_nr LIKE 'FWERK%'
OR
boeking.artikel_nr LIKE 'FREIS%' THEN boeking.aantal
END) AS AllesWR, LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(dbo.serapp.bestek,
LEN(dbo.serapp.bestek) - 1)) AS BestekKlein
FROM dbo.boeking, dbo.opdracht, dbo.sertoe, dbo.serapp
WHERE (dbo.boeking.best_spec2 = dbo.sertoe.toestel) AND
(dbo.boeking.werkbonnr = dbo.opdracht.bonnr) AND (dbo.sertoe.apparaat =
dbo.serapp.apparaat)
AND (dbo.opdracht.afmeld <> '') AND
(dbo.boeking.kost_soort = 'T') AND (NOT (dbo.boeking.werknemer LIKE '5%'))
AND
(NOT (dbo.boeking.werknemer LIKE '6%')) AND
(serapp.bestek NOT IN ('CLOSE IN', 'GEISER', 'WASEMKAP', 'KOOK')) AND
(dbo.sertoe.knummer = '') AND
(dbo.boeking.bestemming <> '')
GROUP BY boeking.boekdatum, serapp.bestek
Post by SQL
create table #temp (SomeName varchar(50))
insert into #temp
select 'SINTERKLAAS' UNION ALL
select 'MARCO' UNION ALL
select 'AJAX' UNION ALL
select 'AMSTERDAM'
SELECT LEFT(SomeName,1) + LOWER(right(SomeName,len(Somename) -1)) FROM
#temp
http://sqlservercode.blogspot.com/
SQL
2006-01-19 17:01:29 UTC
Permalink
Alison,

probeer dit


in plaats van LEFT(dbo.serapp.bestek, 1) +
LOWER(RIGHT(dbo.serapp.bestek,
LEN(dbo.serapp.bestek) - 1)) AS BestekKlein

doe dit

LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(dbo.serapp.bestek) - 1)) AS BestekKlein

Ik heb het getest

declare @V char(20)
select @v = 'ABABABABABA '


SELECT LEFT(@v,1) + LOWER(right(rtrim(@v),len(rtrim(@v)) -1)) Goed
, LEFT(@v,1) + LOWER(right(@v,len(rtrim(@v)) -1)) Fout
Alison Givens
2006-01-20 12:42:36 UTC
Permalink
LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(RTRIM(dbo.serapp.bestek)) - 1)) AS BestekKlein

Er blijken spaties in voor te komen. Bovenstaand werkt wel (type is CHAR)
Post by SQL
Alison,
probeer dit
in plaats van LEFT(dbo.serapp.bestek, 1) +
LOWER(RIGHT(dbo.serapp.bestek,
LEN(dbo.serapp.bestek) - 1)) AS BestekKlein
doe dit
LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(dbo.serapp.bestek) - 1)) AS BestekKlein
Ik heb het getest
Hugo Kornelis
2006-01-21 21:52:15 UTC
Permalink
Post by SQL
LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(RTRIM(dbo.serapp.bestek)) - 1)) AS BestekKlein
Er blijken spaties in voor te komen. Bovenstaand werkt wel (type is CHAR)
Beste Alison,

Met CHAR ipv VARCHAR kan het een stuk makkelijker. Omdat alle strings
altijd de volledige lengte zijn (aangevuld met spaties, indien nodig)
hoef je geen LEN en RTRIM te gebruiken.

Als serapp.bestek CHAR(20) is, gebruik dan:

LEFT(dbo.serapp.bestek, 1) + RIGHT(dbo.serapp.bestek, 19)

Als de lengte van serapp.bestek niet 20 is, vervang dan de 19 hierboven
door de eigenlijke lengte van de kolom minus één.
--
Hugo Kornelis, SQL Server MVP
Alison Givens
2006-01-25 11:38:09 UTC
Permalink
Dit werkt helaas niet. Het blijven gewoon hoofdletters.
Verder heb ik nog een probleem, wanneer het veld 'bestek' niet gevuld is.
Dan krijg ik een foutmelding.

Onderstaand werkt dus, maar niet bij een leeg veld
LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(RTRIM(dbo.serapp.bestek)) - 1)) AS BestekKlein

Kan ik dit afvangen in die formule?
(in de query zelf is geen optie, aangezien er wel op gerapporteerd moet
worden dat 'bestek' leeg is)
Post by Hugo Kornelis
Met CHAR ipv VARCHAR kan het een stuk makkelijker. Omdat alle strings
altijd de volledige lengte zijn (aangevuld met spaties, indien nodig)
hoef je geen LEN en RTRIM te gebruiken.
LEFT(dbo.serapp.bestek, 1) + RIGHT(dbo.serapp.bestek, 19)
Als de lengte van serapp.bestek niet 20 is, vervang dan de 19 hierboven
door de eigenlijke lengte van de kolom minus één.
--
Hugo Kornelis, SQL Server MVP
SQL
2006-01-25 13:07:48 UTC
Permalink
Alison, probeer dit dan, het werkt op mijn PC
Doe dit in een andere DB omdat serapp al bestaat

create table serapp (bestek char(50))
insert into serapp
select 'SINTERKLAAS' UNION ALL
select 'MARCO' UNION ALL
select 'AJAX' UNION ALL
select ''

SELECT CASE WHEN LEN(dbo.serapp.bestek) > 0 then
LEFT(dbo.serapp.bestek, 1) + LOWER(RIGHT(RTRIM(dbo.serapp.bestek),
LEN(RTRIM(dbo.serapp.bestek)) - 1)) ELSE '' END AS BestekKlein
FROM
serapp
Hugo Kornelis
2006-01-25 21:21:09 UTC
Permalink
Post by Alison Givens
Dit werkt helaas niet. Het blijven gewoon hoofdletters.
Hoi Alison,

Stomme fout van me. Ik had me geconcentreerd op het krijgen van de
juiste delen van de string, en was vervolgens vergeten er netjes UPPER
en LOWER omheen te zetten.

Onderstaande versie werkt voor mij. Ook voor lege strings en voor NULL.

CREATE TABLE TestTabel (TestKolom char(30))
go
INSERT INTO TestTabel (TestKolom)
VALUES ('HUGO')
INSERT INTO TestTabel (TestKolom)
VALUES ('ALISON')
INSERT INTO TestTabel (TestKolom)
VALUES ('')
INSERT INTO TestTabel (TestKolom)
VALUES (NULL)
INSERT INTO TestTabel (TestKolom)
VALUES ('grOOt eN KLeiN DooR ElkaAr')
go
SELECT UPPER(LEFT(TestKolom, 1)) + LOWER(RIGHT(TestKolom, 29)) --
CHAR(30) - 1 = 29
FROM TestTabel
go
DROP TABLE TestTabel
go

Maar uiteraard kun je ook de versie van "SQL" gebruiken!
--
Hugo Kornelis, SQL Server MVP
Alison Givens
2006-02-01 09:38:00 UTC
Permalink
Hugo en SQL bedankt!
Post by Hugo Kornelis
Post by Alison Givens
Dit werkt helaas niet. Het blijven gewoon hoofdletters.
Hoi Alison,
Stomme fout van me. Ik had me geconcentreerd op het krijgen van de
juiste delen van de string, en was vervolgens vergeten er netjes UPPER
en LOWER omheen te zetten.
Onderstaande versie werkt voor mij. Ook voor lege strings en voor NULL.
CREATE TABLE TestTabel (TestKolom char(30))
go
INSERT INTO TestTabel (TestKolom)
VALUES ('HUGO')
INSERT INTO TestTabel (TestKolom)
VALUES ('ALISON')
INSERT INTO TestTabel (TestKolom)
VALUES ('')
INSERT INTO TestTabel (TestKolom)
VALUES (NULL)
INSERT INTO TestTabel (TestKolom)
VALUES ('grOOt eN KLeiN DooR ElkaAr')
go
SELECT UPPER(LEFT(TestKolom, 1)) + LOWER(RIGHT(TestKolom, 29)) --
CHAR(30) - 1 = 29
FROM TestTabel
go
DROP TABLE TestTabel
go
Maar uiteraard kun je ook de versie van "SQL" gebruiken!
--
Hugo Kornelis, SQL Server MVP
Loading...