hoe naamveld correct weergeven?

Status
Niet open voor verdere reacties.

shidan

Gebruiker
Lid geworden
8 jan 2007
Berichten
351
beste,

ik ben op tabellen aan het werken en merk dat de naamvelden op diverse manieren worden ingevuld.
ofwel allemaal hoofdletters (JAN JANSSENS)
ofwel allemaal kleine letterz (jan janssens)
ofwel correct (Jan Janssens)

Ik wens alle namen correct te zien
(dus de eerste letter en de letter na een spatie moet een hoofdletter zijn).
ik weet dat dit niet altijd correct zal zijn (bvb bij mensen van adel) maar dit is niet erg.

bestaat daar een manier voor?
kan iemand mij verder helpen?

thnx,

shidan
 
Ik zou denken dat de makkelijkste manier is om het te converteren bij het invullen, zodat het gewoon allemaal correct is opgeslagen...

Als je het tijdens het ophalen wilt aanpassen zul je gebruik moeten maken van de UPPER() en LOWER() functies met enig geknip en geplak met SUBSTR() denk, ik kan zo geen ingebouwde functie vinden.
 
In MySQL is daar inderdaad geen standaard functie voor. Wat je wel kunt doen is zelf een functie maken, bijvoorbeeld zoiets:

[sql]DELIMITER //

CREATE FUNCTION ucfirst ( p_string VARCHAR(1000) )
RETURNS VARCHAR(1000)
DETERMINISTIC READS SQL DATA
BEGIN

DECLARE l_length INT DEFAULT 0;
DECLARE l_upper BOOLEAN DEFAULT TRUE;
DECLARE l_character VARCHAR(1);
DECLARE l_output VARCHAR(1000);
DECLARE i INT DEFAULT 0;

SELECT LENGTH( p_string ) INTO l_length;

WHILE i <= l_length DO

SELECT SUBSTR( p_string, i, 1 ) INTO l_character;

IF i = 0
THEN
SET l_output = UPPER( l_character );
ELSEIF l_upper = TRUE
THEN
SET l_output = CONCAT( l_output, UPPER( l_character ) );
ELSE
SET l_output = CONCAT( l_output, LOWER( l_character ) );
END IF;

IF l_character = ' '
THEN
SET l_upper = TRUE;
ELSE
SET l_upper = FALSE;
END IF;

SET i = i + 1;

END WHILE;

RETURN l_output;

END
//

DELIMITER ;[/sql]

Dat werkt dan op deze manier:

[sql]mysql> SELECT ucfirst( 'dgfsjg dFDHlsdf dksSWAdfn ksdl; d DFRbv dcv cv Dv vd' ) AS regel;
+-------------------------------------------------------+
| regel |
+-------------------------------------------------------+
| Dgfsjg Dfdhlsdf Dksswadfn Ksdl; D Dfrbv Dcv Cv Dv Vd |
+-------------------------------------------------------+
1 row in set (0.00 sec)[/sql]
 
Met T-SQL (Microsoft SQL Server) kan het zo:

[SQL]
IF OBJECT_ID(N'udfProperCase',N'FN') IS NOT NULL
DROP FUNCTION udfProperCase;
GO

CREATE FUNCTION udfProperCase
(
@Str VARCHAR(1000)
)
RETURNS VARCHAR(1000)
BEGIN
-- Voor propercase gaan we uit van : woorden gescheiden door spatie
DECLARE @Delimiter VARCHAR(1) = ' ';
DECLARE @LUstr VARCHAR(1002);

DECLARE @output VARCHAR(1002);
SELECT @output = '';

-- Delimiter voor en achter het woord voor eerste en laatste positie voor substring
SELECT @LUstr = @Delimiter + @str + @Delimiter;

WITH DelimPos AS
(
SELECT TOP 1002
ROW_NUMBER() OVER(ORDER BY a.column_id) as N
FROM master.sys.all_columns a
CROSS JOIN master.sys.all_columns b
),
SplitText as
(
SELECT SUBSTRING(@LUstr,N + 1,CHARINDEX(@Delimiter,@LUstr,N + 1) - N - 1) AS Word
FROM DelimPos
WHERE N < LEN(@LUstr)
AND SUBSTRING(@LUSTR,N,1) = @Delimiter
)
SELECT @output = @output + SUBSTRING(UPPER(Word),1,1)
+ SUBSTRING(LOWER(WORD),2,LEN(wORD) - 1)
+ @Delimiter
FROM SplitText
RETURN @output
END
GO
[/SQL]

De functie roep je daarna als volgt aan:

[SQL]

SELECT dbo.udfProperCase('JE BENT EEN RUND ALS JE met vuurwerk stunt') AS Voorbeeld

[/SQL]
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan