Oto szybki sposób dodawania nawiasów wokół liczb ujemnych w SQL Server przy użyciu FORMAT()
funkcjonować.
Celem jest, aby nawiasy były dodawane tylko do ujemnych wartości. Do wartości dodatnich lub zer nie są dodawane żadne nawiasy. Ponadto nawiasy zastępują wszelkie znaki minusa, które w przeciwnym razie byłyby wyświetlane (innymi słowy, w przypadku użycia nawiasów nie jest wyświetlany żaden znak minus).
Chociaż formatowanie jest często najlepiej pozostawione warstwie prezentacji, mogą wystąpić przypadki, które narzucają rozwiązanie T-SQL w SQL Server. W takich przypadkach mam nadzieję, że ten artykuł pomoże.
Przykład 1 – Automatyczne nawiasy
Jak wspomniano, rozwiązania w tym artykule wykorzystują FORMAT()
funkcjonować. Ta funkcja formatuje wartość liczbową (lub datę/godzinę), a następnie zwraca sformatowany ciąg reprezentujący tę wartość.
Wywołując tę funkcję, przekazujesz wartość do sformatowania oraz ciąg formatujący, który określa sposób jej formatowania. Możesz również podać trzeci argument, aby zdefiniować ustawienia regionalne/kulturę, które będą używane w danych wyjściowych.
Idę z tym, że istnieją przypadki, w których FORMAT()
automatycznie otoczy wartości ujemne w nawiasach, w zależności od używanego ciągu formatu i kultury.
Oto przykład formatowania liczby jako waluty przy użyciu dwóch różnych argumentów „kultury”:
SELECT FORMAT(-1.23, 'C', 'en-us') 'en-us', FORMAT(-1.23, 'C', 'en-gb') 'en-gb';
Wynik:
+---------+---------+ | en-us | en-gb | |---------+---------| | ($1.23) | -£1.23 | +---------+---------+
W tym przypadku jest to kombinacja ciągu formatu i kultury, która określa, czy wartości ujemne są otoczone nawiasami, czy nie.
C
to standardowy specyfikator formatu liczb, który formatuje liczbę jako walutę. Gdy używany jest ten specyfikator formatu, dokładne dane wyjściowe są określane przez kulturę. Dzieje się tak, ponieważ różne kultury używają różnych konwencji do wyświetlania kwot walutowych. Kultura określi rzeczywisty symbol waluty, który ma być użyty, jego umiejscowienie, a także sposób wyświetlania wartości ujemnych.
Jeśli nie określisz kultury, zostanie użyty język bieżącej sesji. Jest to zwykle domyślny język użytkownika, ale można go również zmienić za pomocą SET LANGUAGE
oświadczenie.
Przykład 2 – formatowanie warunkowe
Jeśli standardowy ciąg formatu nie zapewnia wymaganych wyników, musisz zamiast tego użyć niestandardowego ciągu formatu liczb.
Oto przykład użycia niestandardowego ciągu formatu liczbowego do ujęcia wyniku w nawiasach:
SELECT FORMAT(-123, '0; (0)') Result;
Wynik:
+----------+ | Result | |----------| | (123) | +----------+
Aby osiągnąć pożądane wyniki, ciąg formatu używa separatora sekcji, aby zapewnić formatowanie warunkowe.
Formatowanie warunkowe polega na określeniu innego formatu w zależności od danego warunku. Używając FORMAT()
funkcji, możesz użyć formatowania warunkowego, aby zastosować różne formatowanie do liczby, w zależności od tego, czy liczba jest dodatnia, ujemna czy zero.
W tym kontekście formatowanie warunkowe jest możliwe dzięki średnikowi (;
). Nazywa się to „separatorem sekcji”. W tym przypadku użyłem tylko jednego średnika, ponieważ chcę mieć tylko dwie sekcje (aby odróżnić negatywy od nienegatywów).
Gdy uwzględnione są tylko dwie sekcje, pierwsza sekcja dotyczy zarówno wartości dodatnich, jak i zer. Druga sekcja dotyczy wartości ujemnych. Możesz również dodać kolejny średnik, aby określić inny format tylko dla zer (więcej na ten temat poniżej).
Przykład 3 – w porównaniu z dodatnim i zerowym
Oto kolejny przykład, tym razem dodaję wartość dodatnią i zero (tylko po to, aby wyraźniej zademonstrować ten punkt).
SELECT FORMAT(-123, '0; (0)') Negative, FORMAT(123, '0; (0)') Positive, FORMAT(0, '0; (0)') Zero;
Wynik:
+------------+------------+--------+ | Negative | Positive | Zero | |------------+------------+--------| | (123) | 123 | 0 | +------------+------------+--------+
Przykład 4 – Alternatywne formatowanie
Nie ograniczasz się tylko do nawiasów. Możesz na przykład użyć nawiasów klamrowych, nawiasów kwadratowych lub prawie wszystkiego, co chcesz.
SELECT FORMAT(-123, '0; {0}') R1, FORMAT(-123, '0; [0]') R2, FORMAT(-123, '0; WARNING! NEGATIVE VALUE!!!') R3;
Wynik:
+--------+--------+-----------------------------+ | R1 | R2 | R3 | |--------+--------+-----------------------------| | {123} | [123] | WARNING! NEGATIVE VALUE!!! | +--------+--------+-----------------------------+
Przykład 5 – Trzy warunki
Jak wspomniano, możesz również dodać trzeci warunek, aby zapewnić oddzielne formatowanie zer. Oto krótki przykład:
SELECT FORMAT(-123, '0; (0); 0 (Zero)') R1, FORMAT(123, '0; (0); 0 (Zero)') R2, FORMAT(0, '0; (0); 0 (Zero)') R3;
Wynik:
+--------+------+-----------+ | R1 | R2 | R3 | |--------+------+-----------| | (123) | 123 | 0 (Zero) | +--------+------+-----------+
Przykład 6 – Gdzie jest znak minus?
Być może zauważyłeś, że znak minus nie pojawił się nawet na wartościach ujemnych. Dzieje się tak, ponieważ separator sekcji ignoruje wszelkie istniejące wcześniej formatowanie wartości (w tym wszelkie znaki minus). Oznacza to, że jeśli używasz formatowania warunkowego i rzeczywiście chcesz mieć znak minus przy wartościach ujemnych, musisz dodać go do ciągu formatu:
SELECT FORMAT(-123, '0; 0 (Negative); 0 (Zero)') 'Without Minus Sign', FORMAT(-123, '0; -0 (Negative); 0 (Zero)') 'With Minus Sign';
Wynik:
+----------------------+-------------------+ | Without Minus Sign | With Minus Sign | |----------------------+-------------------| | 123 (Negative) | -123 (Negative) | +----------------------+-------------------+
Jednak w niektórych przypadkach znak minus pozostaje nienaruszony (przynajmniej w moim systemie):
SELECT FORMAT(123, '0;; 0 (Zero)') Positive, FORMAT(-123, '0;; 0 (Zero)') Negative;
Wynik:
+------------+------------+ | Positive | Negative | |------------+------------| | 123 | -123 | +------------+------------+
W tym przykładzie wartości ujemne i dodatnie dzielą tę samą sekcję. Dzieje się tak, ponieważ dodałem separator sekcji dla wartości ujemnych, ale pozostawiłem go pusty. W tym przypadku ciąg formatu w pierwszej sekcji dotyczy zarówno pozytywnych i wartości ujemne.
Jak wspomniano, w tym przypadku znak minus pozostaje nienaruszony dla wartości ujemnych.