Dopełnianie zerami

Kolejne zadanie bojowe: do liczby z jakiejś kolumny dodać np. zera – ale albo na początku, albo na końcu. I żeby jeszcze była stała długość tak powstałej wartości, czyli np. dla liczby 12 dopełniać trzema zerami, ale dla 142 już tylko dwoma. Poniżej przykład dla zadanego ciągu 10 znaków.

Na szybko można rozwiązać to tak:
– dla dopełnienia ciągu z lewej strony
SELECT RIGHT(‚0000000000’+ CAST(kolumna AS VARCHAR(10)), 10)

Doklejamy na początek 10 zer, po czym bierzemy dziesięć ostatnich znaków.

– dla dopełnienia ciągu z prawej strony
SELECT LEFT(CAST(kolumna AS VARCHAR(10)) + ‚0000000000’, 10)

Tak samo – doklejamy 10 zer, tyle że na końcu i bierzemy pierwsze dziesięć znaków.

Reklamy

Połącz wiersze w jeden

Zadanie bojowe: w T-SQLu połączyć wynik kilku wierszy w jeden. Najprościej odpowiada na ten temat np. ASP FAQ, a rozszerza go przywoływany tam post z grupy dyskusyjnej microsoft.public.sqlserver.programming.

Krótko:
– tworzysz długą zmienną (n)varchar
– robisz SELECT z tą zmienną
Czytaj dalej

Znajdź ostatnie n znaków

Żona zadała mi pytanie w związku z rozwijanym w firmie systemem pisanym w C# i opartym o SQL Server: jakimi sposobami z ciągu znaków np. „kkk/384/d3/a/332” można wyciągnąć liczby po ostatnim znaku „/”?

Do głowy przychodzą mi dwa rozwiązania:

  • wyszukać ostatnie pojawienie się znaku „/” i odpowiednio wyciąć string
  • zastosować wyrażenie regularne do znalezienia cyfr na końcu ciągu

W przypadku SQL Servera nie ma wbudowanych bibliotek do wyrażeń regularnych. Można napisać własne funkcje wykorzystujące SQLCLR (dla wersji 2005 i 2008) lub OLE (dla wersji 2000) lub skorzystać z istniejących zewnętrznych bibliotek dll (np. xp_pcre). W tym konkretnym przypadku można jednak osiągnąć zamierzony wynik żonglując standardowymi funkcjami T-SQL. Czytaj dalej

Zaokrąglanie

Po ostatnich poprawkach w kodzie procedur wyliczających ile kasy należy komu wypłacić odbiorca zwrócił uwagę, że w jego przypadku wychodzą inne wyniki przy zaokrąglaniu do uzgodnionej liczby miejsc po przecinku. Testowanie wyników odbywało się poprzez Accessa i procedury w VBA, co powodowało rozjazd z danymi SQL Servera. Cóż, zaokrąglenia mogą być różne, nie tylko znane wszem i wobec arytmetyczne. Źle tylko, że tak samo nazywająca się funkcja ma różne implementacje w różnych językach – trzeba sprawdzać która z nich akurat jest przyjęta. Czytaj dalej

osql i polskie znaki

W poprzednim tekście napisałem, że w przypadku SQL Servera 2000 do automatyzacji zadań możemy wykorzystać osql. Niestety może on mieć problem w przypadku gdy chcemy załadować plik zawierający polskie znaki. Na szybko można wykorzystać dwa rozwiązania:

  • zamiana strony kodowej ładowanego pliku,
  • lub uruchomienie Query Analyzera z poziomu konsoli Czytaj dalej

Uruchom plik SQL

Dłuższe skrypty SQL mam w zwyczaju pisać w zwykłym edytorze tekstowym a nie w dedykowanym narzędziu – w przypadku używanego w pracy SQL Servera 2000 jest to Query Analyzer (QA) [w późniejszych wersjach zintegrowany w SQL Server Management Studio (SSMS)]. Powodów jest kilka – choćby przyzwyczajenie do skrótów klawiszowych czy makr. Przyjąłem też zasadę, że pisząc kod procedur składowanych trzymam każdą z nich w oddzielnym pliku. Wszystko jest fajnie dopóki nie trzeba wprowadzić zmian w kilku procedurach jednocześnie i potem zsynchronizować je między środowiskiem testowym i produkcyjnym. Standardowe podejście to ręczne wczytanie i uruchomienie pliku z poziomu QA, ale przy -nastu plikach jest to męczące. Jak to zautomatyzować? Czytaj dalej

Mnożenie rekordów w SQL

Podczas prac nad jednym z modułów systemu który rozwijam pojawił się pomysł mnożenia wartości zgrupowanych danych. Niestety standardowy mechanizm SQL pozwala jedynie na kilka operacji na rekordach: sum(), avg(), count() etc. Jak to zrobić? Okazuje się, że banalnie prosto:

W = exp(sum(log(kolumna)))

Czyli z grubsza wystarczy zamienić mnożenie na sumowanie logarytmów.

Taa. Jasne. Czytaj dalej