Kako sam simulirao LPAD/RPAD funkcije pomoću T-SQL-a
Mora se priznati Oracleovom PL/SQL-u da stvarno ima ugrađenih finih string funkcija, dok se Microsoftov T-SQL baš i ne može time pohvaliti. Kako na poslu radim sa MS SQL Server 2000, više sam puta imao potrebu za nekim komocijama koje pruža konkurentski mu produkt. Jedna od njih je definitivno LPAD/RPAD funkcija.
Često mi se dešavalo da mi treba neko polje, koje je u biti integer, sa vodećim nulama tipa char(18). Znači imam recimo šifru materijala 10125, a meni treba u obliku ‘000000000000010125′. Ad hoc bi se moglo konkatenirati string od 18 nula sa tim poljem i onda uzeti zadnjih 18 znakova.
Ovako nekako:
[sourcecode lang="sql"] SELECT RIGHT(’000000000000000000′ + CAST(NekoPolje as VARCHAR(18)), 18) FROM dbo.NekaTablica [/sourcecode]
Nakon nekoliko puta što sam ovako nešto morao napisati odlučih napraviti UDFicu koja će mi to raditi.
Prvi mačići se u vodu bacaju
Mislim si ja: Meni treba neka funkcija kojoj ću ja prosljediti polje, do koje duljine hoću da mi napuni i kojeg znakovnog niza. Onda ću fino petljicu zavrtit koliko mi puta treba i izgraditi string od tog niza u maksimalnoj duljini. Zatim konkatenacija sa originalnim poljem i na kraju odrezat s desna. Zapravo simulacija onog gore. I napravio ja tako…
[sourcecode lang="sql"] CREATE FUNCTION dbo.lpad ( @Value VARCHAR(50), @PadCount INT, @PadChar CHAR(1) ) RETURNS VARCHAR (255) AS BEGIN DECLARE @PaddedValue AS VARCHAR(255) DECLARE @Counter AS INT SET @PaddedValue = ” SET @Value = RTRIM(LTRIM(@Value)) SET @Counter = 1 WHILE @Counter <= @PadCount BEGIN SET @PaddedValue = @PaddedValue + @PadChar SET @Counter = @Counter + 1 END SET @PaddedValue = RIGHT(@PaddedValue + @Value, @PadCount) RETURN @PaddedValue END [/sourcecode]
Konačna verzija
Gornji je primjer, iako funkcionalan, ostavio mjesta za optimizaciju. Npr. loop koji gradi varijablu sa traženim brojem (@PaddedValue) ponavljanja se zapravo barem jedanput izvrti bez potrebe jer je potrebna duljina varijable jednaka maksimalnoj/traženoj duljini - duljina originalnog stringa. Kad si bolje razmislim taj loop je skroz nepotreban jer postoji string funkcija REPLICATE. Na kraju moja UDFica izgleda ovako:
[sourcecode lang="sql"] CREATE FUNCTION dbo.lpad ( @Value VARCHAR(50), @PadCount INT, @PadChar CHAR(1) ) RETURNS VARCHAR (255) AS BEGIN DECLARE @PaddedValue AS VARCHAR(255) SET @Value = RTRIM(LTRIM(@Value)) SET @PaddedValue = REPLICATE(@PadChar, @PadCount) SET @PaddedValue = RIGHT(@PaddedValue + @Value, @PadCount) RETURN @PaddedValue END [/sourcecode]
Vjeko
19. veljače, 2008