Jeśli używasz Oracle Database lub MySQL, masz szczęście, że masz LPAD()
i RPAD()
funkcje, które pozwalają na dopełnienie napisu danym znakiem (lub znakami) z lewej i/lub z prawej strony.
Jednak SQL Server (a dokładniej T-SQL) nie zawiera tych funkcji. Więc jeśli potrzebujesz trochę lewego wypełnienia, musisz improwizować.
W tym artykule przedstawiono cztery opcje dopełniania liczby zerami wiodącymi w programie SQL Server. Możesz więc robić takie rzeczy jak zakręt 7
w 007
. Trzy z tych opcji działają na ciągach, więc możesz również zastosować dopełnienie do danych tekstowych.
Metoda 1 – Użyj funkcji FORMAT()
Jeśli chcesz zastosować wiodące zera do liczby, ta opcja powinna wystarczyć. Ta opcja używa FORMAT()
funkcjonować. Ta funkcja zwraca liczbę jako ciąg znaków w naszym określonym formacie:
SELECT FORMAT(7, '000');
Wynik:
007
W tym przypadku używamy 0
specyfikator formatu, aby sformatować liczbę z zerami wiodącymi, jeśli ma to zastosowanie. To tylko jeden z wielu niestandardowych specyfikatorów formatu. Specyfikatory formatu niestandardowego pozwalają nam bardzo precyzyjnie określić, w jaki sposób jest sformatowany nasz numer.
Zauważ, że FORMAT()
funkcja jest tylko dla liczb i wartości daty i godziny. Więc jeśli chcesz zastosować dopełnienie do rzeczywistego ciągu, czytaj dalej.
Metoda 2 – Użyj funkcji PRAWO()
Druga metoda wykorzystuje RIGHT()
funkcja zwracająca tylko prawą część ciągu, po dodaniu kilku wiodących zer.
Chociaż stosuję tutaj wiodące zera do „liczby”, w rzeczywistości jest to reprezentacja liczby w postaci ciągu. Więc jeśli musisz zastosować dopełnienie do łańcucha zamiast liczby, ta metoda powinna zadziałać.
SELECT RIGHT('000' + '1234', 7);
Wynik:
0001234
7
określa, ile znaków powinien mieć wynik końcowy (po dodaniu zer).
Zmniejszanie długości
Więc jeśli zmniejszymy tę liczbę, zmniejszy się liczba wiodących zer:
SELECT RIGHT('000' + '1234', 6);
Wynik:
001234
Zwiększanie długości
Ale jeśli zwiększymy liczbę, musimy upewnić się, że podaliśmy wystarczającą liczbę zer, aby uzyskać wymaganą długość:
SELECT RIGHT('000000' + '1234', 10);
Wynik:
0000001234
W przeciwnym razie skończymy z tym:
SELECT RIGHT('000' + '1234', 10);
Wynik:
0001234
Skrócenie liczby
Pamiętaj też, że jeśli nie określisz wystarczającej liczby znaków dla długości wynikowego ciągu, liczba zostanie odcięta, a otrzymasz tylko prawą część liczby:
SELECT RIGHT('000' + '1234', 2);
Wynik:
34
Więc w tym przypadku początkowa liczba została obcięta, a wiodące zera zostały zignorowane.
Jest to jeden ze scenariuszy, w których wynik różni się od wyników MySQL i Oracle LPAD()
funkcjonować. Ta funkcja wytworzyłaby pierwsze 2 (niewypełnione) cyfry zamiast ostatnich 2 cyfr. Tak:
SELECT LPAD(1234, 2, 0);
Wynik:
12
Jeśli potrzebujesz rozwiązania SQL Server, które będzie zachowywać się jak LPAD()
w takich przypadkach wypróbuj to:
SELECT RIGHT(REPLICATE('0', 3) + LEFT('1234', 2), 2);
Wynik:
12
Pamiętaj jednak, że ten sam wynik uzyskasz po prostu za pomocą LEFT()
funkcja sama:
SELECT LEFT('1234', 2);
Wynik:
12
Poza tym staram się wymyślić powód, dla którego ktokolwiek chciałby skrócić liczbę (biorąc pod uwagę, że próbuje ją uzupełnić), ale przynajmniej jest to coś do rozważenia.
Metoda 3 – Użyj kombinacji RIGHT() i REPLICATE()
Ta metoda jest prawie taka sama jak poprzednia, z tą różnicą, że po prostu zamieniam trzy zera na REPLICATE()
funkcja:
SELECT RIGHT(REPLICATE('0', 3) + '1234', 7);
Wynik:
0001234
REPLICATE()
Funkcja pozwala uniknąć wielokrotnego wpisywania każdego zera (lub innego znaku).
Metoda bonusowa:Metoda 4 – Użyj kombinacji REPLACE() i STR()
Ta metoda pochodzi z zupełnie innego punktu widzenia niż poprzednie metody:
SELECT REPLACE(STR('1234', 6),' ','0');
Wynik:
001234
Tutaj używamy REPLACE()
funkcja w połączeniu z STR()
funkcja konwertująca liczbę na łańcuch o określonej długości, a następnie konwertująca dowolne znaki spacji na zero.
Jedną rzeczą, na którą należy uważać, jest to, że jeśli skrócisz liczbę (tak jak zrobiliśmy to w poprzednim przykładzie), otrzymasz kilka gwiazdek zamiast (skróconej) liczby:
SELECT REPLACE(STR('1234', 2),' ','0');
Wynik:
**