Mam ciąg, który ma do 3 znaków, gdy jest tworzony po raz pierwszy w SQL Server 2008 R2.
Chciałbym uzupełnić go wiodącymi zerami, więc jeśli jego oryginalna wartość to „1”, wówczas nowa wartość to „001”. Lub jeśli jego pierwotna wartość wynosiła „23”, nową wartością jest „023”. Lub jeśli jego pierwotna wartość to „124”, wówczas nowa wartość jest taka sama jak wartość oryginalna.
Używam SQL Server 2008 R2. Jak miałbym to zrobić za pomocą T-SQL?
sql-server
tsql
Sunil
źródło
źródło
Odpowiedzi:
Jeśli pole jest już ciągiem, zadziała
Jeśli chcesz, aby wartości null były wyświetlane jako „000”
Może to być liczba całkowita - wtedy byś chciał
źródło
Chociaż pytanie dotyczyło SQL Server 2008 R2, na wypadek, gdyby ktoś czyta to w wersji 2012 i nowszych, od tego czasu stało się to znacznie łatwiejsze dzięki zastosowaniu FORMATU .
Jako argument formatu możesz przekazać standardowy ciąg formatu liczbowego lub niestandardowy ciąg formatu liczbowego (dziękuję Vadimowi Ovchinnikovowi za tę wskazówkę).
Dla tego pytania na przykład taki kod
wyjścia
źródło
Bezpieczna metoda:
Ma to tę zaletę, że zwraca ciąg
'***'
dla n <0 lub n> 999, co jest ładnym i oczywistym wskaźnikiem danych wejściowych poza zakresem. Inne metody wymienione tutaj zawiodą po cichu przez obcięcie danych wejściowych do 3-znakowego podłańcucha.źródło
SELECT REPLACE(STR('1',3),' ','0')
Przerwy:SELECT REPLACE(STR('1A',3),' ','0')
. Właśnie mnie to wypaliło dzisiaj, gdy użytkownik wpisał literę w ciągu wejściowym, a ja nie przetestowałem tego przypadku.Oto bardziej ogólna technika wypełniania lewej strony do dowolnej pożądanej szerokości:
Jeśli jednak masz do czynienia z wartościami ujemnymi i dopełnianiem zer wiodących, ani ta, ani inna sugerowana technika nie będzie działać. Otrzymasz coś, co wygląda następująco:
[Prawdopodobnie nie to, co chciałeś]
Więc… będziesz musiał przeskoczyć kilka dodatkowych obręczy Oto jedno podejście, które odpowiednio sformatuje liczby ujemne:
Należy zauważyć, że
convert()
wywołania powinny określać[n]varchar
długość wystarczającą do przechwycenia przekonwertowanego wyniku z obcięciem.źródło
Oto wariant odpowiedzi Hogana, której używam w SQL Server Express 2012:
Zamiast martwić się, czy pole jest łańcuchem, czy nie, po prostu
CONCAT
go, ponieważ i tak wyświetli łańcuch. Dodatkowo, jeśli pole może być aNULL
, użycieISNULL
może być konieczne, aby uniknąć uzyskiwaniaNULL
wyników przez funkcję .źródło
Zawsze uważałem, że następująca metoda jest bardzo pomocna.
źródło
Użyj tej funkcji, która pasuje do każdej sytuacji.
Próbka wyjściowa
źródło
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;
co zwraca pierwszy przykład Salara powyżej. Dzięki Salar.DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;
co zwraca0000002016
pierwszy przykład powyżej.Dla tych, którzy chcą zaktualizować swoje istniejące dane, oto zapytanie:
źródło
W przypadku liczb całkowitych możesz użyć niejawnej konwersji z int na varchar:
źródło
Znam jego stary bilet, po prostu chciałem go udostępnić.
Znalazłem ten kod szukający rozwiązania. Nie jestem pewien, czy to działa na wszystkich wersjach MSSQL Mam MSSQL 2016.
zwraca „0023” 4 w funkcji STR to całkowita długość łącznie z wartością. Przykłady 4, 23 i 123 będą miały 4 w STR i zostanie dodana poprawna liczba zer. Możesz go zwiększyć lub zmniejszyć. Nie musisz uzyskiwać długości na 23.
Edycja: Widzę, że jest taki sam jak post @Anon.
źródło
Miałem podobny problem z kolumną całkowitą jak wejście, gdy potrzebowałem wyjścia varchar (lub łańcucha) o stałej wielkości. Na przykład od 1 do „01”, od 12 do „12”. Ten kod działa:
Jeśli wejście jest również kolumną varchar, możesz uniknąć części odlewniczej.
źródło
Aby uzyskać bardziej dynamiczne podejście, wypróbuj to.
źródło
Wypróbuj to ze stałą długością.
źródło
Napisałem to, ponieważ miałem wymagania do określonej długości (9). Wypełnia lewą stronę @pattern TYLKO wtedy, gdy wejście wymaga dopełnienia. Zawsze powinien zwracać długość zdefiniowaną w @pattern.
Zwraca 1234 wejścia
źródło
To proste
Lubić:
źródło
Przybyłem tutaj, aby dowiedzieć się, jak przekonwertować przesunięcie strefy czasowej na ciąg strefy czasowej do konwertowania dat na DATETIMEOFFSET w SQL Server 2008. Brutto, ale konieczne.
Potrzebuję więc 1 metody, która poradzi sobie z liczbami ujemnymi i dodatnimi, formatując je na dwa znaki z wiodącym zerem w razie potrzeby. Odpowiedź Anonsa zbliżyła mnie, ale pojawiłyby się ujemne wartości w strefie czasowej
0-5
wymagane-05
Więc z drobną poprawką w odpowiedzi, działa to dla wszystkich konwersji godzinnych w strefie czasowej
źródło
Stworzyłem tę funkcję, która obsługuje bigint i jeden wiodący zero lub inny pojedynczy znak (zwrócono maksymalnie 20 znaków) i pozwala na uzyskanie długości wyników mniejszej niż długość liczby wejściowej:
źródło