Spis treści:

Kategoria:SQL Server


Uzupełnianie numeru zerami lub spacjami z lewej strony

PadLeft w wersji SQL Server

Tym razem rozpatrzę pewien, chyba dość powszechny, problem. Przypomnijmy sobie, jak działa funkcja PadLeft znana z technologii .NET.

"23".PadLeft(5); //wynik = "   23"
"23".PadLeft(5, '0'); //wynik = "00023"

W .NET istnieją dwie przeciążone metody. Jedna z nich uzupełnia wartość spacjami, druga natomiast podanym w parametrze znakiem. Naszym zadaniem będzie napisanie odpowiednika w SQL Server.

Kilka technik uzupełniania

Ten sam problem można rozwiązać na kilka sposobów. Przyjrzyjmy się im. Zaprezentowane są one na poniższym listingu:

--Skorzystanie z efektów funkcji STR
DECLARE @num int = 12
SELECT REPLACE(STR(@num, 6), ' ''0')

GO

--Przycięcie wzorca pustego tekstu z lewej strony
DECLARE @num int = 12
SELECT RIGHT('000000'CAST(@num AS varchar), 6)

GO

--Technika stosowana dla tekstów
--Liczbę należy wcześniej zamienić na tekst
DECLARE @num int = 12
DECLARE @col varchar(100) = CAST(@num AS varchar)
SELECT REPLICATE('0', 6-LEN(@col))+@col

Myślę, że techniki nie wymagają szczegółowych wyjaśnień. Każda z nich uzupełnia liczbę 12 zerami z przodu w taki sposób, aby całość mogła być wypisana jako '000012&spos;. Ilość cyfr jest stała, i wynosi 6. Spróbujmy teraz udoskonalić te krótkie skrypty i zamknąć je w funkcjach wzorowanych na ich odpowiednikach (PadLeft) z .NET Framework.

Skrypty w postaci funkcji

Jeżeli metoda będzie używana częściej niż kilka razy, warto stworzyć sobie uniwersalną funkcję. Przyjrzyjmy się, w jaki sposób można przerobić pierwszą metodę na odpowiednią funkcję:

--Stworzenie uniwersalnej funkcji
CREATE FUNCTION dbo.PadLeft(@num int, @len int, @char charRETURNS varchar(32) AS
BEGIN
RETURN REPLACE(STR(@num, @len), ' ', @char)
END

GO

--Wywołanie funkcji
SELECT dbo.PadLeft(12,10,'0')

Kategoria:SQL Server

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?