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
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).
Super robota, korzystając z innych internetowych kalkulatorow po prostu wątpiłem w ich prawdomówność, w końcu trafiłem tutaj i wynik w końcu jest wiarygodny. 40 km w 2 h 810 kcal, ciekawostka: na fitatu wyliczyło mi 5700 kcal 😊 najlepiej będzie chyba jak kupię zegarek sportowy.
Wielkie dzieki za solidne wyjasnienia tematu.